forked from rpms/openssl
		
	import openssl-3.0.1-20.el9_0
This commit is contained in:
		
						commit
						701577a00f
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| SOURCES/openssl-3.0.1-hobbled.tar.xz | ||||
							
								
								
									
										1
									
								
								.openssl.metadata
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.openssl.metadata
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| 1170b5119f0e591f6a2515d099abd06d0184f77c SOURCES/openssl-3.0.1-hobbled.tar.xz | ||||
							
								
								
									
										33
									
								
								SOURCES/0001-Aarch64-and-ppc64le-use-lib64.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								SOURCES/0001-Aarch64-and-ppc64le-use-lib64.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| From 603a35802319c0459737e3f067369ceb990fe2e6 Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tmraz@fedoraproject.org> | ||||
| Date: Thu, 24 Sep 2020 09:01:41 +0200 | ||||
| Subject: Aarch64 and ppc64le use lib64 | ||||
| 
 | ||||
| (Was openssl-1.1.1-build.patch) | ||||
| ---
 | ||||
|  Configurations/10-main.conf | 2 ++ | ||||
|  1 file changed, 2 insertions(+) | ||||
| 
 | ||||
| diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf
 | ||||
| index d7580bf3e1..a7dbfd7f40 100644
 | ||||
| --- a/Configurations/10-main.conf
 | ||||
| +++ b/Configurations/10-main.conf
 | ||||
| @@ -723,6 +723,7 @@ my %targets = (
 | ||||
|          lib_cppflags     => add("-DL_ENDIAN"), | ||||
|          asm_arch         => 'ppc64', | ||||
|          perlasm_scheme   => "linux64le", | ||||
| +        multilib         => "64",
 | ||||
|      }, | ||||
|   | ||||
|      "linux-armv4" => { | ||||
| @@ -765,6 +766,7 @@ my %targets = (
 | ||||
|          inherit_from     => [ "linux-generic64" ], | ||||
|          asm_arch         => 'aarch64', | ||||
|          perlasm_scheme   => "linux64", | ||||
| +        multilib         => "64",
 | ||||
|      }, | ||||
|      "linux-arm64ilp32" => {  # https://wiki.linaro.org/Platform/arm64-ilp32 | ||||
|          inherit_from     => [ "linux-generic32" ], | ||||
| -- 
 | ||||
| 2.26.2 | ||||
| 
 | ||||
| @ -0,0 +1,68 @@ | ||||
| From 41df9ae215cee9574e17e6f887c96a7c97d588f5 Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tmraz@fedoraproject.org> | ||||
| Date: Thu, 24 Sep 2020 09:03:40 +0200 | ||||
| Subject: Use more general default values in openssl.cnf | ||||
| 
 | ||||
| Also set sha256 as default hash, although that should not be | ||||
| necessary anymore. | ||||
| 
 | ||||
| (was openssl-1.1.1-defaults.patch) | ||||
| ---
 | ||||
|  apps/openssl.cnf | 12 +++++++----- | ||||
|  1 file changed, 7 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/apps/openssl.cnf b/apps/openssl.cnf
 | ||||
| index 97567a67be..eb25a0ac48 100644
 | ||||
| --- a/apps/openssl.cnf
 | ||||
| +++ b/apps/openssl.cnf
 | ||||
| @@ -104,7 +104,7 @@ cert_opt 	= ca_default		# Certificate field options
 | ||||
|   | ||||
|  default_days	= 365			# how long to certify for | ||||
|  default_crl_days= 30			# how long before next CRL | ||||
| -default_md	= default		# use public key default MD
 | ||||
| +default_md	= sha256		# use SHA-256 by default
 | ||||
|  preserve	= no			# keep passed DN ordering | ||||
|   | ||||
|  # A few difference way of specifying how similar the request should look | ||||
| @@ -136,6 +136,7 @@ emailAddress		= optional
 | ||||
|  #################################################################### | ||||
|  [ req ] | ||||
|  default_bits		= 2048 | ||||
| +default_md		= sha256
 | ||||
|  default_keyfile 	= privkey.pem | ||||
|  distinguished_name	= req_distinguished_name | ||||
|  attributes		= req_attributes | ||||
| @@ -158,17 +159,18 @@ string_mask = utf8only
 | ||||
|   | ||||
|  [ req_distinguished_name ] | ||||
|  countryName			= Country Name (2 letter code) | ||||
| -countryName_default		= AU
 | ||||
| +countryName_default		= XX
 | ||||
|  countryName_min			= 2 | ||||
|  countryName_max			= 2 | ||||
|   | ||||
|  stateOrProvinceName		= State or Province Name (full name) | ||||
| -stateOrProvinceName_default	= Some-State
 | ||||
| +#stateOrProvinceName_default	= Default Province
 | ||||
|   | ||||
|  localityName			= Locality Name (eg, city) | ||||
| +localityName_default		= Default City
 | ||||
|   | ||||
|  0.organizationName		= Organization Name (eg, company) | ||||
| -0.organizationName_default	= Internet Widgits Pty Ltd
 | ||||
| +0.organizationName_default	= Default Company Ltd
 | ||||
|   | ||||
|  # we can do this but it is not needed normally :-) | ||||
|  #1.organizationName		= Second Organization Name (eg, company) | ||||
| @@ -177,7 +179,7 @@ localityName			= Locality Name (eg, city)
 | ||||
|  organizationalUnitName		= Organizational Unit Name (eg, section) | ||||
|  #organizationalUnitName_default	= | ||||
|   | ||||
| -commonName			= Common Name (e.g. server FQDN or YOUR name)
 | ||||
| +commonName			= Common Name (eg, your name or your server\'s hostname)
 | ||||
|  commonName_max			= 64 | ||||
|   | ||||
|  emailAddress			= Email Address | ||||
| -- 
 | ||||
| 2.26.2 | ||||
| 
 | ||||
							
								
								
									
										26
									
								
								SOURCES/0003-Do-not-install-html-docs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								SOURCES/0003-Do-not-install-html-docs.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| From 3d5755df8d09ca841c0aca2d7344db060f6cc97f Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tmraz@fedoraproject.org> | ||||
| Date: Thu, 24 Sep 2020 09:05:55 +0200 | ||||
| Subject: Do not install html docs | ||||
| 
 | ||||
| (was openssl-1.1.1-no-html.patch) | ||||
| ---
 | ||||
|  Configurations/unix-Makefile.tmpl | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/Configurations/unix-Makefile.tmpl b/Configurations/unix-Makefile.tmpl
 | ||||
| index 342e46d24d..9f369edf0e 100644
 | ||||
| --- a/Configurations/unix-Makefile.tmpl
 | ||||
| +++ b/Configurations/unix-Makefile.tmpl
 | ||||
| @@ -554,7 +554,7 @@ install_sw: install_dev install_engines install_modules install_runtime
 | ||||
|   | ||||
|  uninstall_sw: uninstall_runtime uninstall_modules uninstall_engines uninstall_dev | ||||
|   | ||||
| -install_docs: install_man_docs install_html_docs
 | ||||
| +install_docs: install_man_docs
 | ||||
|   | ||||
|  uninstall_docs: uninstall_man_docs uninstall_html_docs | ||||
|  	$(RM) -r $(DESTDIR)$(DOCDIR) | ||||
| -- 
 | ||||
| 2.26.2 | ||||
| 
 | ||||
| @ -0,0 +1,73 @@ | ||||
| From 6790960076742a9053c624e26fbb87fcd5789e27 Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tmraz@fedoraproject.org> | ||||
| Date: Thu, 24 Sep 2020 09:17:26 +0200 | ||||
| Subject: Override default paths for the CA directory tree | ||||
| 
 | ||||
| Also add default section to load crypto-policies configuration | ||||
| for TLS. | ||||
| 
 | ||||
| It needs to be reverted before running tests. | ||||
| 
 | ||||
| (was openssl-1.1.1-conf-paths.patch) | ||||
| ---
 | ||||
|  apps/CA.pl.in    |  2 +- | ||||
|  apps/openssl.cnf | 20 ++++++++++++++++++-- | ||||
|  2 files changed, 19 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| diff --git a/apps/CA.pl.in b/apps/CA.pl.in
 | ||||
| index c0afb96716..d6a5fabd16 100644
 | ||||
| --- a/apps/CA.pl.in
 | ||||
| +++ b/apps/CA.pl.in
 | ||||
| @@ -29,7 +29,7 @@ my $X509 = "$openssl x509";
 | ||||
|  my $PKCS12 = "$openssl pkcs12"; | ||||
|   | ||||
|  # Default values for various configuration settings. | ||||
| -my $CATOP = "./demoCA";
 | ||||
| +my $CATOP = "/etc/pki/CA";
 | ||||
|  my $CAKEY = "cakey.pem"; | ||||
|  my $CAREQ = "careq.pem"; | ||||
|  my $CACERT = "cacert.pem"; | ||||
| diff -up openssl-3.0.0-alpha16/apps/openssl.cnf.default-tls openssl-3.0.0-alpha16/apps/openssl.cnf
 | ||||
| --- openssl-3.0.0-alpha16/apps/openssl.cnf.default-tls	2021-07-06 13:41:39.204978272 +0200
 | ||||
| +++ openssl-3.0.0-alpha16/apps/openssl.cnf	2021-07-06 13:49:50.362857683 +0200
 | ||||
| @@ -53,6 +53,8 @@ tsa_policy3 = 1.2.3.4.5.7
 | ||||
|   | ||||
|  [openssl_init] | ||||
|  providers = provider_sect | ||||
| +# Load default TLS policy configuration
 | ||||
| +ssl_conf = ssl_module
 | ||||
|   | ||||
|  # List of providers to load | ||||
|  [provider_sect] | ||||
| @@ -64,6 +66,13 @@ default = default_sect
 | ||||
|  [default_sect] | ||||
|  # activate = 1 | ||||
|   | ||||
| +[ ssl_module ]
 | ||||
| +
 | ||||
| +system_default = crypto_policy
 | ||||
| +
 | ||||
| +[ crypto_policy ]
 | ||||
| +
 | ||||
| +.include = /etc/crypto-policies/back-ends/opensslcnf.config
 | ||||
|   | ||||
|  #################################################################### | ||||
|  [ ca ] | ||||
| @@ -72,7 +81,7 @@ default_ca	= CA_default		# The default c
 | ||||
|  #################################################################### | ||||
|  [ CA_default ] | ||||
|   | ||||
| -dir		= ./demoCA		# Where everything is kept
 | ||||
| +dir		= /etc/pki/CA		# Where everything is kept
 | ||||
|  certs		= $dir/certs		# Where the issued certs are kept | ||||
|  crl_dir		= $dir/crl		# Where the issued crl are kept | ||||
|  database	= $dir/index.txt	# database index file. | ||||
| @@ -304,7 +313,7 @@ default_tsa = tsa_config1	# the default
 | ||||
|  [ tsa_config1 ] | ||||
|   | ||||
|  # These are used by the TSA reply generation only. | ||||
| -dir		= ./demoCA		# TSA root directory
 | ||||
| +dir		= /etc/pki/CA		# TSA root directory
 | ||||
|  serial		= $dir/tsaserial	# The current serial number (mandatory) | ||||
|  crypto_device	= builtin		# OpenSSL engine to use for signing | ||||
|  signer_cert	= $dir/tsacert.pem 	# The TSA signing certificate | ||||
							
								
								
									
										28
									
								
								SOURCES/0005-apps-ca-fix-md-option-help-text.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								SOURCES/0005-apps-ca-fix-md-option-help-text.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| From 3d8fa9859501b07e02b76b5577e2915d5851e927 Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tmraz@fedoraproject.org> | ||||
| Date: Thu, 24 Sep 2020 09:27:18 +0200 | ||||
| Subject: apps/ca: fix md option help text | ||||
| 
 | ||||
| upstreamable | ||||
| 
 | ||||
| (was openssl-1.1.1-apps-dgst.patch) | ||||
| ---
 | ||||
|  apps/ca.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/apps/ca.c b/apps/ca.c
 | ||||
| index 0f21b4fa1c..3d4b2c1673 100755
 | ||||
| --- a/apps/ca.c
 | ||||
| +++ b/apps/ca.c
 | ||||
| @@ -209,7 +209,7 @@ const OPTIONS ca_options[] = {
 | ||||
|      {"noemailDN", OPT_NOEMAILDN, '-', "Don't add the EMAIL field to the DN"}, | ||||
|   | ||||
|      OPT_SECTION("Signing"), | ||||
| -    {"md", OPT_MD, 's', "Digest to use, such as sha256"},
 | ||||
| +    {"md", OPT_MD, 's', "Digest to use, such as sha256; see openssl help for list"},
 | ||||
|      {"keyfile", OPT_KEYFILE, 's', "The CA private key"}, | ||||
|      {"keyform", OPT_KEYFORM, 'f', | ||||
|       "Private key file format (ENGINE, other values ignored)"}, | ||||
| -- 
 | ||||
| 2.26.2 | ||||
| 
 | ||||
| @ -0,0 +1,29 @@ | ||||
| From 3f9deff30ae6efbfe979043b00cdf649b39793c0 Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tmraz@fedoraproject.org> | ||||
| Date: Thu, 24 Sep 2020 09:51:34 +0200 | ||||
| Subject: Disable signature verification with totally unsafe hash algorithms | ||||
| 
 | ||||
| (was openssl-1.1.1-no-weak-verify.patch) | ||||
| ---
 | ||||
|  crypto/asn1/a_verify.c | 5 +++++ | ||||
|  1 file changed, 5 insertions(+) | ||||
| 
 | ||||
| diff --git a/crypto/asn1/a_verify.c b/crypto/asn1/a_verify.c
 | ||||
| index b7eed914b0..af62f0ef08 100644
 | ||||
| --- a/crypto/asn1/a_verify.c
 | ||||
| +++ b/crypto/asn1/a_verify.c
 | ||||
| @@ -152,6 +152,11 @@ int ASN1_item_verify_ctx(const ASN1_ITEM *it, const X509_ALGOR *alg,
 | ||||
|              ERR_raise(ERR_LIB_ASN1, ERR_R_EVP_LIB); | ||||
|          if (ret <= 1) | ||||
|              goto err; | ||||
| +    } else if ((mdnid == NID_md5
 | ||||
| +               && ossl_safe_getenv("OPENSSL_ENABLE_MD5_VERIFY") == NULL) ||
 | ||||
| +               mdnid == NID_md4 || mdnid == NID_md2 || mdnid == NID_sha) {
 | ||||
| +        ERR_raise(ERR_LIB_ASN1, ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM);
 | ||||
| +        goto err;
 | ||||
|      } else { | ||||
|          const EVP_MD *type = NULL; | ||||
|   | ||||
| -- 
 | ||||
| 2.26.2 | ||||
| 
 | ||||
| @ -0,0 +1,323 @@ | ||||
| From 736d709ec194b3a763e004696df22792c62a11fc Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tmraz@fedoraproject.org> | ||||
| Date: Thu, 24 Sep 2020 10:16:46 +0200 | ||||
| Subject: Add support for PROFILE=SYSTEM system default cipherlist | ||||
| 
 | ||||
| (was openssl-1.1.1-system-cipherlist.patch) | ||||
| ---
 | ||||
|  Configurations/unix-Makefile.tmpl |  5 ++ | ||||
|  Configure                         | 10 +++- | ||||
|  doc/man1/openssl-ciphers.pod.in   |  9 ++++ | ||||
|  include/openssl/ssl.h.in          |  5 ++ | ||||
|  ssl/ssl_ciph.c                    | 88 +++++++++++++++++++++++++++---- | ||||
|  ssl/ssl_lib.c                     |  4 +- | ||||
|  test/cipherlist_test.c            |  2 + | ||||
|  util/libcrypto.num                |  1 + | ||||
|  8 files changed, 110 insertions(+), 14 deletions(-) | ||||
| 
 | ||||
| diff --git a/Configurations/unix-Makefile.tmpl b/Configurations/unix-Makefile.tmpl
 | ||||
| index 9f369edf0e..c52389f831 100644
 | ||||
| --- a/Configurations/unix-Makefile.tmpl
 | ||||
| +++ b/Configurations/unix-Makefile.tmpl
 | ||||
| @@ -269,6 +269,10 @@ MANDIR=$(INSTALLTOP)/share/man
 | ||||
|  DOCDIR=$(INSTALLTOP)/share/doc/$(BASENAME) | ||||
|  HTMLDIR=$(DOCDIR)/html | ||||
|   | ||||
| +{- output_off() if $config{system_ciphers_file} eq ""; "" -}
 | ||||
| +SYSTEM_CIPHERS_FILE_DEFINE=-DSYSTEM_CIPHERS_FILE="\"{- $config{system_ciphers_file} -}\""
 | ||||
| +{- output_on() if $config{system_ciphers_file} eq ""; "" -}
 | ||||
| +
 | ||||
|  # MANSUFFIX is for the benefit of anyone who may want to have a suffix | ||||
|  # appended after the manpage file section number.  "ssl" is popular, | ||||
|  # resulting in files such as config.5ssl rather than config.5. | ||||
| @@ -292,6 +296,7 @@ CC=$(CROSS_COMPILE){- $config{CC} -}
 | ||||
|  CXX={- $config{CXX} ? "\$(CROSS_COMPILE)$config{CXX}" : '' -} | ||||
|  CPPFLAGS={- our $cppflags1 = join(" ", | ||||
|                                    (map { "-D".$_} @{$config{CPPDEFINES}}), | ||||
| +                                  "\$(SYSTEM_CIPHERS_FILE_DEFINE)",
 | ||||
|                                    (map { "-I".$_} @{$config{CPPINCLUDES}}), | ||||
|                                    @{$config{CPPFLAGS}}) -} | ||||
|  CFLAGS={- join(' ', @{$config{CFLAGS}}) -} | ||||
| diff --git a/doc/man1/openssl-ciphers.pod.in b/doc/man1/openssl-ciphers.pod.in
 | ||||
| index b4ed3e51d5..2122e6bdfd 100644
 | ||||
| --- a/doc/man1/openssl-ciphers.pod.in
 | ||||
| +++ b/doc/man1/openssl-ciphers.pod.in
 | ||||
| @@ -187,6 +187,15 @@ As of OpenSSL 1.0.0, the B<ALL> cipher suites are sensibly ordered by default.
 | ||||
|   | ||||
|  The cipher suites not enabled by B<ALL>, currently B<eNULL>. | ||||
|   | ||||
| +=item B<PROFILE=SYSTEM>
 | ||||
| +
 | ||||
| +The list of enabled cipher suites will be loaded from the system crypto policy
 | ||||
| +configuration file B</etc/crypto-policies/back-ends/openssl.config>.
 | ||||
| +See also L<update-crypto-policies(8)>.
 | ||||
| +This is the default behavior unless an application explicitly sets a cipher
 | ||||
| +list. If used in a cipher list configuration value this string must be at the
 | ||||
| +beginning of the cipher list, otherwise it will not be recognized.
 | ||||
| +
 | ||||
|  =item B<HIGH> | ||||
|   | ||||
|  "High" encryption cipher suites. This currently means those with key lengths | ||||
| diff --git a/include/openssl/ssl.h.in b/include/openssl/ssl.h.in
 | ||||
| index f9a61609e4..c6f95fed3f 100644
 | ||||
| --- a/include/openssl/ssl.h.in
 | ||||
| +++ b/include/openssl/ssl.h.in
 | ||||
| @@ -209,6 +209,11 @@ extern "C" {
 | ||||
|   * throwing out anonymous and unencrypted ciphersuites! (The latter are not | ||||
|   * actually enabled by ALL, but "ALL:RSA" would enable some of them.) | ||||
|   */ | ||||
| +# ifdef SYSTEM_CIPHERS_FILE
 | ||||
| +#  define SSL_SYSTEM_DEFAULT_CIPHER_LIST "PROFILE=SYSTEM"
 | ||||
| +# else
 | ||||
| +#  define SSL_SYSTEM_DEFAULT_CIPHER_LIST OSSL_default_cipher_list()
 | ||||
| +# endif
 | ||||
|   | ||||
|  /* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ | ||||
|  # define SSL_SENT_SHUTDOWN       1 | ||||
| diff --git a/ssl/ssl_ciph.c b/ssl/ssl_ciph.c
 | ||||
| index b1d3f7919e..f7cc7fed48 100644
 | ||||
| --- a/ssl/ssl_ciph.c
 | ||||
| +++ b/ssl/ssl_ciph.c
 | ||||
| @@ -1411,6 +1411,53 @@ int SSL_set_ciphersuites(SSL *s, const char *str)
 | ||||
|      return ret; | ||||
|  } | ||||
|   | ||||
| +#ifdef SYSTEM_CIPHERS_FILE
 | ||||
| +static char *load_system_str(const char *suffix)
 | ||||
| +{
 | ||||
| +    FILE *fp;
 | ||||
| +    char buf[1024];
 | ||||
| +    char *new_rules;
 | ||||
| +    const char *ciphers_path;
 | ||||
| +    unsigned len, slen;
 | ||||
| +
 | ||||
| +    if ((ciphers_path = ossl_safe_getenv("OPENSSL_SYSTEM_CIPHERS_OVERRIDE")) == NULL)
 | ||||
| +        ciphers_path = SYSTEM_CIPHERS_FILE;
 | ||||
| +    fp = fopen(ciphers_path, "r");
 | ||||
| +    if (fp == NULL || fgets(buf, sizeof(buf), fp) == NULL) {
 | ||||
| +        /* cannot open or file is empty */
 | ||||
| +        snprintf(buf, sizeof(buf), "%s", SSL_DEFAULT_CIPHER_LIST);
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    if (fp)
 | ||||
| +        fclose(fp);
 | ||||
| +
 | ||||
| +    slen = strlen(suffix);
 | ||||
| +    len = strlen(buf);
 | ||||
| +
 | ||||
| +    if (buf[len - 1] == '\n') {
 | ||||
| +        len--;
 | ||||
| +        buf[len] = 0;
 | ||||
| +    }
 | ||||
| +    if (buf[len - 1] == '\r') {
 | ||||
| +        len--;
 | ||||
| +        buf[len] = 0;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    new_rules = OPENSSL_malloc(len + slen + 1);
 | ||||
| +    if (new_rules == 0)
 | ||||
| +        return NULL;
 | ||||
| +
 | ||||
| +    memcpy(new_rules, buf, len);
 | ||||
| +    if (slen > 0) {
 | ||||
| +        memcpy(&new_rules[len], suffix, slen);
 | ||||
| +        len += slen;
 | ||||
| +    }
 | ||||
| +    new_rules[len] = 0;
 | ||||
| +
 | ||||
| +    return new_rules;
 | ||||
| +}
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(SSL_CTX *ctx, | ||||
|                                               STACK_OF(SSL_CIPHER) *tls13_ciphersuites, | ||||
|                                               STACK_OF(SSL_CIPHER) **cipher_list, | ||||
| @@ -1425,15 +1472,25 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(SSL_CTX *ctx,
 | ||||
|      CIPHER_ORDER *co_list = NULL, *head = NULL, *tail = NULL, *curr; | ||||
|      const SSL_CIPHER **ca_list = NULL; | ||||
|      const SSL_METHOD *ssl_method = ctx->method; | ||||
| +#ifdef SYSTEM_CIPHERS_FILE
 | ||||
| +    char *new_rules = NULL;
 | ||||
| +
 | ||||
| +    if (rule_str != NULL && strncmp(rule_str, "PROFILE=SYSTEM", 14) == 0) {
 | ||||
| +        char *p = rule_str + 14;
 | ||||
| +
 | ||||
| +        new_rules = load_system_str(p);
 | ||||
| +        rule_str = new_rules;
 | ||||
| +    }
 | ||||
| +#endif
 | ||||
|   | ||||
|      /* | ||||
|       * Return with error if nothing to do. | ||||
|       */ | ||||
|      if (rule_str == NULL || cipher_list == NULL || cipher_list_by_id == NULL) | ||||
| -        return NULL;
 | ||||
| +        goto err;
 | ||||
| 
 | ||||
|      if (!check_suiteb_cipher_list(ssl_method, c, &rule_str)) | ||||
| -        return NULL;
 | ||||
| +        goto err;
 | ||||
|   | ||||
|      /* | ||||
|       * To reduce the work to do we only want to process the compiled | ||||
| @@ -1456,7 +1513,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(SSL_CTX *ctx,
 | ||||
|      co_list = OPENSSL_malloc(sizeof(*co_list) * num_of_ciphers); | ||||
|      if (co_list == NULL) { | ||||
|          ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); | ||||
| -        return NULL;          /* Failure */
 | ||||
| +        goto err;
 | ||||
|      } | ||||
|   | ||||
|      ssl_cipher_collect_ciphers(ssl_method, num_of_ciphers, | ||||
| @@ -1522,8 +1579,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(SSL_CTX *ctx,
 | ||||
|       * in force within each class | ||||
|       */ | ||||
|      if (!ssl_cipher_strength_sort(&head, &tail)) { | ||||
| -        OPENSSL_free(co_list);
 | ||||
| -        return NULL;
 | ||||
| +        goto err;
 | ||||
|      } | ||||
|   | ||||
|      /* | ||||
| @@ -1568,9 +1624,8 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(SSL_CTX *ctx,
 | ||||
|      num_of_alias_max = num_of_ciphers + num_of_group_aliases + 1; | ||||
|      ca_list = OPENSSL_malloc(sizeof(*ca_list) * num_of_alias_max); | ||||
|      if (ca_list == NULL) { | ||||
| -        OPENSSL_free(co_list);
 | ||||
|          ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); | ||||
| -        return NULL;          /* Failure */
 | ||||
| +        goto err;
 | ||||
|      } | ||||
|      ssl_cipher_collect_aliases(ca_list, num_of_group_aliases, | ||||
|                                 disabled_mkey, disabled_auth, disabled_enc, | ||||
| @@ -1596,8 +1651,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(SSL_CTX *ctx,
 | ||||
|      OPENSSL_free(ca_list);      /* Not needed anymore */ | ||||
|   | ||||
|      if (!ok) {                  /* Rule processing failure */ | ||||
| -        OPENSSL_free(co_list);
 | ||||
| -        return NULL;
 | ||||
| +        goto err;
 | ||||
|      } | ||||
|   | ||||
|      /* | ||||
| @@ -1605,10 +1659,13 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(SSL_CTX *ctx,
 | ||||
|       * if we cannot get one. | ||||
|       */ | ||||
|      if ((cipherstack = sk_SSL_CIPHER_new_null()) == NULL) { | ||||
| -        OPENSSL_free(co_list);
 | ||||
| -        return NULL;
 | ||||
| +        goto err;
 | ||||
|      } | ||||
|   | ||||
| +#ifdef SYSTEM_CIPHERS_FILE
 | ||||
| +    OPENSSL_free(new_rules);    /* Not needed anymore */
 | ||||
| +#endif
 | ||||
| +
 | ||||
|      /* Add TLSv1.3 ciphers first - we always prefer those if possible */ | ||||
|      for (i = 0; i < sk_SSL_CIPHER_num(tls13_ciphersuites); i++) { | ||||
|          const SSL_CIPHER *sslc = sk_SSL_CIPHER_value(tls13_ciphersuites, i); | ||||
| @@ -1656,6 +1714,14 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(SSL_CTX *ctx,
 | ||||
|      *cipher_list = cipherstack; | ||||
|   | ||||
|      return cipherstack; | ||||
| +
 | ||||
| +err:
 | ||||
| +    OPENSSL_free(co_list);
 | ||||
| +#ifdef SYSTEM_CIPHERS_FILE
 | ||||
| +    OPENSSL_free(new_rules);
 | ||||
| +#endif
 | ||||
| +    return NULL;
 | ||||
| +  
 | ||||
|  } | ||||
|   | ||||
|  char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) | ||||
| diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c
 | ||||
| index d14d5819ba..48d491219a 100644
 | ||||
| --- a/ssl/ssl_lib.c
 | ||||
| +++ b/ssl/ssl_lib.c
 | ||||
| @@ -660,7 +660,7 @@ int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth)
 | ||||
|                                  ctx->tls13_ciphersuites, | ||||
|                                  &(ctx->cipher_list), | ||||
|                                  &(ctx->cipher_list_by_id), | ||||
| -                                OSSL_default_cipher_list(), ctx->cert);
 | ||||
| +                                SSL_SYSTEM_DEFAULT_CIPHER_LIST, ctx->cert);
 | ||||
|      if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0)) { | ||||
|          ERR_raise(ERR_LIB_SSL, SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS); | ||||
|          return 0; | ||||
| @@ -3193,7 +3193,7 @@ SSL_CTX *SSL_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq,
 | ||||
|      if (!ssl_create_cipher_list(ret, | ||||
|                                  ret->tls13_ciphersuites, | ||||
|                                  &ret->cipher_list, &ret->cipher_list_by_id, | ||||
| -                                OSSL_default_cipher_list(), ret->cert)
 | ||||
| +                                SSL_SYSTEM_DEFAULT_CIPHER_LIST, ret->cert)
 | ||||
|          || sk_SSL_CIPHER_num(ret->cipher_list) <= 0) { | ||||
|          ERR_raise(ERR_LIB_SSL, SSL_R_LIBRARY_HAS_NO_CIPHERS); | ||||
|          goto err2; | ||||
| diff --git a/test/cipherlist_test.c b/test/cipherlist_test.c
 | ||||
| index 380f0727fc..6922a87c30 100644
 | ||||
| --- a/test/cipherlist_test.c
 | ||||
| +++ b/test/cipherlist_test.c
 | ||||
| @@ -244,7 +244,9 @@ end:
 | ||||
|   | ||||
|  int setup_tests(void) | ||||
|  { | ||||
| +#ifndef SYSTEM_CIPHERS_FILE
 | ||||
|      ADD_TEST(test_default_cipherlist_implicit); | ||||
| +#endif
 | ||||
|      ADD_TEST(test_default_cipherlist_explicit); | ||||
|      ADD_TEST(test_default_cipherlist_clear); | ||||
|      return 1; | ||||
| diff --git a/util/libcrypto.num b/util/libcrypto.num
 | ||||
| index 404a706fab..e81fa9ec3e 100644
 | ||||
| --- a/util/libcrypto.num
 | ||||
| +++ b/util/libcrypto.num
 | ||||
| @@ -5282,3 +5282,4 @@ OSSL_DECODER_CTX_set_input_structure    ?	3_0_0	EXIST::FUNCTION:
 | ||||
|  ASN1_TIME_print_ex                      5553	3_0_0	EXIST::FUNCTION: | ||||
|  EVP_PKEY_get0_provider                  5554	3_0_0	EXIST::FUNCTION: | ||||
|  EVP_PKEY_CTX_get0_provider              5555	3_0_0	EXIST::FUNCTION: | ||||
| +ossl_safe_getenv                        ?	3_0_0	EXIST::FUNCTION:
 | ||||
| -- 
 | ||||
| 2.26.2 | ||||
| 
 | ||||
| diff -up openssl-3.0.0-beta1/Configure.sys-default openssl-3.0.0-beta1/Configure
 | ||||
| --- openssl-3.0.0-beta1/Configure.sys-default	2021-06-29 11:47:58.978144386 +0200
 | ||||
| +++ openssl-3.0.0-beta1/Configure	2021-06-29 11:52:01.631126260 +0200
 | ||||
| @@ -27,7 +27,7 @@ use OpenSSL::config;
 | ||||
|  my $orig_death_handler = $SIG{__DIE__}; | ||||
|  $SIG{__DIE__} = \&death_handler; | ||||
|   | ||||
| -my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]\n";
 | ||||
| +my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--system-ciphers-file=SYSTEMCIPHERFILE] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]\n";
 | ||||
|   | ||||
|  my $banner = <<"EOF"; | ||||
|   | ||||
| @@ -61,6 +61,10 @@ EOF
 | ||||
|  #               given with --prefix. | ||||
|  #               This becomes the value of OPENSSLDIR in Makefile and in C. | ||||
|  #               (Default: PREFIX/ssl) | ||||
| +#
 | ||||
| +# --system-ciphers-file  A file to read cipher string from when the PROFILE=SYSTEM
 | ||||
| +#		cipher is specified (default).
 | ||||
| +#
 | ||||
|  # --banner=".." Output specified text instead of default completion banner | ||||
|  # | ||||
|  # -w            Don't wait after showing a Configure warning | ||||
| @@ -385,6 +389,7 @@ $config{prefix}="";
 | ||||
|  $config{openssldir}=""; | ||||
|  $config{processor}=""; | ||||
|  $config{libdir}=""; | ||||
| +$config{system_ciphers_file}="";
 | ||||
|  my $auto_threads=1;    # enable threads automatically? true by default | ||||
|  my $default_ranlib; | ||||
|   | ||||
| @@ -987,6 +992,10 @@ while (@argvcopy)
 | ||||
|                          die "FIPS key too long (64 bytes max)\n" | ||||
|                             if length $1 > 64; | ||||
|                          } | ||||
| +		elsif (/^--system-ciphers-file=(.*)$/)
 | ||||
| +			{
 | ||||
| +			$config{system_ciphers_file}=$1;
 | ||||
| +			}
 | ||||
|                  elsif (/^--banner=(.*)$/) | ||||
|                          { | ||||
|                          $banner = $1 . "\n"; | ||||
							
								
								
									
										87
									
								
								SOURCES/0008-Add-FIPS_mode-compatibility-macro.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								SOURCES/0008-Add-FIPS_mode-compatibility-macro.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,87 @@ | ||||
| From 5b2ec9a54037d7b007324bf53e067e73511cdfe4 Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tmraz@fedoraproject.org> | ||||
| Date: Thu, 26 Nov 2020 14:00:16 +0100 | ||||
| Subject: Add FIPS_mode() compatibility macro | ||||
| 
 | ||||
| The macro calls EVP_default_properties_is_fips_enabled() on the | ||||
| default context. | ||||
| ---
 | ||||
|  include/openssl/crypto.h.in |  1 + | ||||
|  include/openssl/fips.h      | 25 +++++++++++++++++++++++++ | ||||
|  test/property_test.c        | 13 +++++++++++++ | ||||
|  3 files changed, 39 insertions(+) | ||||
|  create mode 100644 include/openssl/fips.h | ||||
| 
 | ||||
| diff --git a/include/openssl/crypto.h.in b/include/openssl/crypto.h.in
 | ||||
| index 1036da9a2b..9d4896fcaf 100644
 | ||||
| --- a/include/openssl/crypto.h.in
 | ||||
| +++ b/include/openssl/crypto.h.in
 | ||||
| @@ -38,6 +38,7 @@ use OpenSSL::stackhash qw(generate_stack_macros);
 | ||||
|  # include <openssl/opensslconf.h> | ||||
|  # include <openssl/cryptoerr.h> | ||||
|  # include <openssl/core.h> | ||||
| +# include <openssl/fips.h>
 | ||||
|   | ||||
|  # ifdef CHARSET_EBCDIC | ||||
|  #  include <openssl/ebcdic.h> | ||||
| diff --git a/include/openssl/fips.h b/include/openssl/fips.h
 | ||||
| new file mode 100644 | ||||
| index 0000000000..c64f0f8e8f
 | ||||
| --- /dev/null
 | ||||
| +++ b/include/openssl/fips.h
 | ||||
| @@ -0,0 +1,25 @@
 | ||||
| +/*
 | ||||
| + * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved.
 | ||||
| + *
 | ||||
| + * Licensed under the Apache License 2.0 (the "License").  You may not use
 | ||||
| + * this file except in compliance with the License.  You can obtain a copy
 | ||||
| + * in the file LICENSE in the source distribution or at
 | ||||
| + * https://www.openssl.org/source/license.html
 | ||||
| + */
 | ||||
| +
 | ||||
| +#ifndef OPENSSL_FIPS_H
 | ||||
| +# define OPENSSL_FIPS_H
 | ||||
| +# pragma once
 | ||||
| +
 | ||||
| +# include <openssl/macros.h>
 | ||||
| +
 | ||||
| +# ifdef __cplusplus
 | ||||
| +extern "C" {
 | ||||
| +# endif
 | ||||
| +
 | ||||
| +# define FIPS_mode() EVP_default_properties_is_fips_enabled(NULL)
 | ||||
| +
 | ||||
| +# ifdef __cplusplus
 | ||||
| +}
 | ||||
| +# endif
 | ||||
| +#endif
 | ||||
| diff -up openssl-3.0.0-beta1/test/property_test.c.fips-macro openssl-3.0.0-beta1/test/property_test.c
 | ||||
| --- openssl-3.0.0-beta1/test/property_test.c.fips-macro	2021-06-29 12:14:58.851557698 +0200
 | ||||
| +++ openssl-3.0.0-beta1/test/property_test.c	2021-06-29 12:17:14.630143832 +0200
 | ||||
| @@ -488,6 +488,18 @@ static int test_property_list_to_string(
 | ||||
|      return ret; | ||||
|  } | ||||
|   | ||||
| +static int test_downstream_FIPS_mode(void)
 | ||||
| +{
 | ||||
| +    int ret = 0;
 | ||||
| +
 | ||||
| +    ret = TEST_true(EVP_set_default_properties(NULL, "fips=yes"))
 | ||||
| +          && TEST_true(FIPS_mode())
 | ||||
| +          && TEST_true(EVP_set_default_properties(NULL, "fips=no"))
 | ||||
| +          && TEST_false(FIPS_mode());
 | ||||
| +
 | ||||
| +    return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
|  int setup_tests(void) | ||||
|  { | ||||
|      ADD_TEST(test_property_string); | ||||
| @@ -500,6 +512,7 @@ int setup_tests(void)
 | ||||
|      ADD_TEST(test_property); | ||||
|      ADD_TEST(test_query_cache_stochastic); | ||||
|      ADD_TEST(test_fips_mode); | ||||
| +    ADD_TEST(test_downstream_FIPS_mode);
 | ||||
|      ADD_ALL_TESTS(test_property_list_to_string, OSSL_NELEM(to_string_tests)); | ||||
|      return 1; | ||||
|  } | ||||
							
								
								
									
										71
									
								
								SOURCES/0009-Add-Kernel-FIPS-mode-flag-support.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								SOURCES/0009-Add-Kernel-FIPS-mode-flag-support.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | ||||
| diff -up openssl-3.0.0-alpha13/crypto/context.c.kernel-fips openssl-3.0.0-alpha13/crypto/context.c
 | ||||
| --- openssl-3.0.0-alpha13/crypto/context.c.kernel-fips	2021-03-16 00:09:55.814826432 +0100
 | ||||
| +++ openssl-3.0.0-alpha13/crypto/context.c	2021-03-16 00:15:55.129043811 +0100
 | ||||
| @@ -12,11 +12,46 @@
 | ||||
|  #include "internal/bio.h" | ||||
|  #include "internal/provider.h" | ||||
|   | ||||
| +# include <sys/types.h>
 | ||||
| +# include <sys/stat.h>
 | ||||
| +# include <fcntl.h>
 | ||||
| +# include <unistd.h>
 | ||||
| +# include <openssl/evp.h>
 | ||||
| +
 | ||||
|  struct ossl_lib_ctx_onfree_list_st { | ||||
|      ossl_lib_ctx_onfree_fn *fn; | ||||
|      struct ossl_lib_ctx_onfree_list_st *next; | ||||
|  }; | ||||
|   | ||||
| +# define FIPS_MODE_SWITCH_FILE "/proc/sys/crypto/fips_enabled"
 | ||||
| +
 | ||||
| +static int kernel_fips_flag;
 | ||||
| +
 | ||||
| +static void read_kernel_fips_flag(void)
 | ||||
| +{
 | ||||
| +	char buf[2] = "0";
 | ||||
| +	int fd;
 | ||||
| +
 | ||||
| +	if (ossl_safe_getenv("OPENSSL_FORCE_FIPS_MODE") != NULL) {
 | ||||
| +		buf[0] = '1';
 | ||||
| +	} else if ((fd = open(FIPS_MODE_SWITCH_FILE, O_RDONLY)) >= 0) {
 | ||||
| +		while (read(fd, buf, sizeof(buf)) < 0 && errno == EINTR) ;
 | ||||
| +		close(fd);
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	if (buf[0] == '1') {
 | ||||
| +		kernel_fips_flag = 1;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +		return;
 | ||||
| +}
 | ||||
| +
 | ||||
| +int ossl_get_kernel_fips_flag()
 | ||||
| +{
 | ||||
| +	return kernel_fips_flag;
 | ||||
| +}
 | ||||
| +
 | ||||
| +
 | ||||
|  struct ossl_lib_ctx_st { | ||||
|      CRYPTO_RWLOCK *lock; | ||||
|      CRYPTO_EX_DATA data; | ||||
| @@ -121,6 +170,7 @@ static CRYPTO_THREAD_LOCAL default_conte
 | ||||
|   | ||||
|  DEFINE_RUN_ONCE_STATIC(default_context_do_init) | ||||
|  { | ||||
| +	 read_kernel_fips_flag();
 | ||||
|      return CRYPTO_THREAD_init_local(&default_context_thread_local, NULL) | ||||
|          && context_init(&default_context_int); | ||||
|  } | ||||
| diff -up openssl-3.0.1/include/internal/provider.h.embed-fips openssl-3.0.1/include/internal/provider.h
 | ||||
| --- openssl-3.0.1/include/internal/provider.h.embed-fips	2022-01-11 13:13:08.323238760 +0100
 | ||||
| +++ openssl-3.0.1/include/internal/provider.h	2022-01-11 13:13:43.522558909 +0100
 | ||||
| @@ -110,6 +110,9 @@ int ossl_provider_init_as_child(OSSL_LIB
 | ||||
|                                  const OSSL_DISPATCH *in); | ||||
|  void ossl_provider_deinit_child(OSSL_LIB_CTX *ctx); | ||||
|   | ||||
| +/* FIPS flag access */
 | ||||
| +int ossl_get_kernel_fips_flag(void);
 | ||||
| +
 | ||||
|  # ifdef __cplusplus | ||||
|  } | ||||
|  # endif | ||||
							
								
								
									
										5013
									
								
								SOURCES/0011-Remove-EC-curves.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5013
									
								
								SOURCES/0011-Remove-EC-curves.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										80
									
								
								SOURCES/0012-Disable-explicit-ec.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								SOURCES/0012-Disable-explicit-ec.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | ||||
| diff -up openssl-3.0.1/crypto/ec/ec_lib.c.disable_explicit_ec openssl-3.0.1/crypto/ec/ec_lib.c
 | ||||
| --- openssl-3.0.1/crypto/ec/ec_lib.c.disable_explicit_ec	2022-02-22 09:08:48.557823665 +0100
 | ||||
| +++ openssl-3.0.1/crypto/ec/ec_lib.c	2022-02-22 09:09:26.634133847 +0100
 | ||||
| @@ -1458,7 +1458,7 @@ static EC_GROUP *ec_group_explicit_to_na
 | ||||
|                  goto err; | ||||
|          } | ||||
|      } else { | ||||
| -        ret_group = (EC_GROUP *)group;
 | ||||
| +        goto err;
 | ||||
|      } | ||||
|      EC_GROUP_free(dup); | ||||
|      return ret_group; | ||||
| diff -up openssl-3.0.1/providers/implementations/keymgmt/ec_kmgmt.c.disable_explicit_ec openssl-3.0.1/providers/implementations/keymgmt/ec_kmgmt.c
 | ||||
| --- openssl-3.0.1/providers/implementations/keymgmt/ec_kmgmt.c.disable_explicit_ec	2022-02-22 13:04:16.850856612 +0100
 | ||||
| +++ openssl-3.0.1/providers/implementations/keymgmt/ec_kmgmt.c	2022-02-22 14:16:19.848369641 +0100
 | ||||
| @@ -936,11 +936,8 @@ int ec_validate(const void *keydata, int
 | ||||
|      if ((selection & OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) != 0) { | ||||
|          int flags = EC_KEY_get_flags(eck); | ||||
|   | ||||
| -        if ((flags & EC_FLAG_CHECK_NAMED_GROUP) != 0)
 | ||||
| -            ok = ok && EC_GROUP_check_named_curve(EC_KEY_get0_group(eck),
 | ||||
| -                           (flags & EC_FLAG_CHECK_NAMED_GROUP_NIST) != 0, ctx);
 | ||||
| -        else
 | ||||
| -            ok = ok && EC_GROUP_check(EC_KEY_get0_group(eck), ctx);
 | ||||
| +        ok = ok && EC_GROUP_check_named_curve(EC_KEY_get0_group(eck),
 | ||||
| +                      (flags & EC_FLAG_CHECK_NAMED_GROUP_NIST) != 0, ctx);
 | ||||
|      } | ||||
|   | ||||
|      if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) { | ||||
| @@ -1217,6 +1214,10 @@ static int ec_gen_assign_group(EC_KEY *e
 | ||||
|          ERR_raise(ERR_LIB_PROV, PROV_R_NO_PARAMETERS_SET); | ||||
|          return 0; | ||||
|      } | ||||
| +    if (EC_GROUP_get_curve_name(group) == NID_undef) {
 | ||||
| +        ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_CURVE);
 | ||||
| +        return 0;
 | ||||
| +    }
 | ||||
|      return EC_KEY_set_group(ec, group) > 0; | ||||
|  } | ||||
|   | ||||
| diff -up openssl-3.0.1/providers/common/securitycheck.c.disable_explicit_ec openssl-3.0.1/providers/common/securitycheck.c
 | ||||
| --- openssl-3.0.1/providers/common/securitycheck.c.disable_explicit_ec	2022-02-25 11:44:19.554673396 +0100
 | ||||
| +++ openssl-3.0.1/providers/common/securitycheck.c	2022-02-25 12:16:38.168610089 +0100
 | ||||
| @@ -93,22 +93,22 @@ int ossl_rsa_check_key(OSSL_LIB_CTX *ctx
 | ||||
|  int ossl_ec_check_key(OSSL_LIB_CTX *ctx, const EC_KEY *ec, int protect) | ||||
|  { | ||||
|  # if !defined(OPENSSL_NO_FIPS_SECURITYCHECKS) | ||||
| -    if (ossl_securitycheck_enabled(ctx)) {
 | ||||
| -        int nid, strength;
 | ||||
| -        const char *curve_name;
 | ||||
| -        const EC_GROUP *group = EC_KEY_get0_group(ec);
 | ||||
| +    int nid, strength;
 | ||||
| +    const char *curve_name;
 | ||||
| +    const EC_GROUP *group = EC_KEY_get0_group(ec);
 | ||||
|   | ||||
| -        if (group == NULL) {
 | ||||
| -            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_CURVE, "No group");
 | ||||
| -            return 0;
 | ||||
| -        }
 | ||||
| -        nid = EC_GROUP_get_curve_name(group);
 | ||||
| -        if (nid == NID_undef) {
 | ||||
| -            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_CURVE,
 | ||||
| -                           "Explicit curves are not allowed in fips mode");
 | ||||
| -            return 0;
 | ||||
| -        }
 | ||||
| +    if (group == NULL) {
 | ||||
| +        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_CURVE, "No group");
 | ||||
| +        return 0;
 | ||||
| +    }
 | ||||
| +    nid = EC_GROUP_get_curve_name(group);
 | ||||
| +    if (nid == NID_undef) {
 | ||||
| +        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_CURVE,
 | ||||
| +                       "Explicit curves are not allowed in this build");
 | ||||
| +        return 0;
 | ||||
| +    }
 | ||||
|   | ||||
| +    if (ossl_securitycheck_enabled(ctx)) {
 | ||||
|          curve_name = EC_curve_nid2nist(nid); | ||||
|          if (curve_name == NULL) { | ||||
|              ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_CURVE, | ||||
							
								
								
									
										75
									
								
								SOURCES/0024-load-legacy-prov.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								SOURCES/0024-load-legacy-prov.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | ||||
| diff -up openssl-3.0.0/apps/openssl.cnf.legacy-prov openssl-3.0.0/apps/openssl.cnf
 | ||||
| --- openssl-3.0.0/apps/openssl.cnf.legacy-prov	2021-09-09 12:06:40.895793297 +0200
 | ||||
| +++ openssl-3.0.0/apps/openssl.cnf	2021-09-09 12:12:33.947482500 +0200
 | ||||
| @@ -42,36 +42,29 @@ tsa_policy1 = 1.2.3.4.1
 | ||||
|  tsa_policy2 = 1.2.3.4.5.6 | ||||
|  tsa_policy3 = 1.2.3.4.5.7 | ||||
|   | ||||
| -# For FIPS
 | ||||
| -# Optionally include a file that is generated by the OpenSSL fipsinstall
 | ||||
| -# application. This file contains configuration data required by the OpenSSL
 | ||||
| -# fips provider. It contains a named section e.g. [fips_sect] which is
 | ||||
| -# referenced from the [provider_sect] below.
 | ||||
| -# Refer to the OpenSSL security policy for more information.
 | ||||
| -# .include fipsmodule.cnf
 | ||||
| -
 | ||||
|  [openssl_init] | ||||
|  providers = provider_sect | ||||
|  # Load default TLS policy configuration | ||||
|  ssl_conf = ssl_module | ||||
|   | ||||
| -# List of providers to load
 | ||||
| -[provider_sect]
 | ||||
| -default = default_sect
 | ||||
| -# The fips section name should match the section name inside the
 | ||||
| -# included fipsmodule.cnf.
 | ||||
| -# fips = fips_sect
 | ||||
| +# Uncomment the sections that start with ## below to enable the legacy provider.
 | ||||
| +# Loading the legacy provider enables support for the following algorithms:
 | ||||
| +# Hashing Algorithms / Message Digests: MD2, MD4, MDC2, WHIRLPOOL, RIPEMD160
 | ||||
| +# Symmetric Ciphers: Blowfish, CAST, DES, IDEA, RC2, RC4,RC5, SEED
 | ||||
| +# Key Derivation Function (KDF): PBKDF1
 | ||||
| +# In general it is not recommended to use the above mentioned algorithms for
 | ||||
| +# security critical operations, as they are cryptographically weak or vulnerable
 | ||||
| +# to side-channel attacks and as such have been deprecated.
 | ||||
|   | ||||
| -# If no providers are activated explicitly, the default one is activated implicitly.
 | ||||
| -# See man 7 OSSL_PROVIDER-default for more details.
 | ||||
| -#
 | ||||
| -# If you add a section explicitly activating any other provider(s), you most
 | ||||
| -# probably need to explicitly activate the default provider, otherwise it
 | ||||
| -# becomes unavailable in openssl.  As a consequence applications depending on
 | ||||
| -# OpenSSL may not work correctly which could lead to significant system
 | ||||
| -# problems including inability to remotely access the system.
 | ||||
| -[default_sect]
 | ||||
| -# activate = 1
 | ||||
| +[provider_sect]
 | ||||
| +default = default_sect
 | ||||
| +##legacy = legacy_sect
 | ||||
| +##
 | ||||
| +[default_sect]
 | ||||
| +activate = 1
 | ||||
| +
 | ||||
| +##[legacy_sect]
 | ||||
| +##activate = 1
 | ||||
|   | ||||
|  [ ssl_module ] | ||||
|   | ||||
| diff -up openssl-3.0.0/doc/man5/config.pod.legacy-prov openssl-3.0.0/doc/man5/config.pod
 | ||||
| --- openssl-3.0.0/doc/man5/config.pod.legacy-prov	2021-09-09 12:09:38.079040853 +0200
 | ||||
| +++ openssl-3.0.0/doc/man5/config.pod	2021-09-09 12:11:56.646224876 +0200
 | ||||
| @@ -273,6 +273,14 @@ significant.
 | ||||
|  All parameters in the section as well as sub-sections are made | ||||
|  available to the provider. | ||||
|   | ||||
| +=head3 Loading the legacy provider
 | ||||
| +
 | ||||
| +Uncomment the sections that start with ## in openssl.cnf
 | ||||
| +to enable the legacy provider.
 | ||||
| +Note: In general it is not recommended to use the above mentioned algorithms for
 | ||||
| +security critical operations, as they are cryptographically weak or vulnerable
 | ||||
| +to side-channel attacks and as such have been deprecated.
 | ||||
| +
 | ||||
|  =head3 Default provider and its activation | ||||
|   | ||||
|  If no providers are activated explicitly, the default one is activated implicitly. | ||||
							
								
								
									
										18
									
								
								SOURCES/0025-for-tests.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								SOURCES/0025-for-tests.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| diff -up openssl-3.0.0/apps/openssl.cnf.xxx openssl-3.0.0/apps/openssl.cnf
 | ||||
| --- openssl-3.0.0/apps/openssl.cnf.xxx	2021-11-23 16:29:50.618691603 +0100
 | ||||
| +++ openssl-3.0.0/apps/openssl.cnf	2021-11-23 16:28:16.872882099 +0100
 | ||||
| @@ -55,11 +55,11 @@ providers = provider_sect
 | ||||
|  # to side-channel attacks and as such have been deprecated. | ||||
|   | ||||
|  [provider_sect] | ||||
| -default = default_sect
 | ||||
| +##default = default_sect
 | ||||
|  ##legacy = legacy_sect | ||||
|  ## | ||||
| -[default_sect]
 | ||||
| -activate = 1
 | ||||
| +##[default_sect]
 | ||||
| +##activate = 1
 | ||||
|   | ||||
|  ##[legacy_sect] | ||||
|  ##activate = 1 | ||||
							
								
								
									
										40
									
								
								SOURCES/0031-tmp-Fix-test-names.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								SOURCES/0031-tmp-Fix-test-names.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | ||||
| diff -up openssl-3.0.0/test/recipes/90-test_sslapi.t.beldmit openssl-3.0.0/test/recipes/90-test_sslapi.t
 | ||||
| --- openssl-3.0.0/test/recipes/90-test_sslapi.t.beldmit	2021-09-22 11:56:49.452507975 +0200
 | ||||
| +++ openssl-3.0.0/test/recipes/90-test_sslapi.t	2021-09-22 11:57:19.371764742 +0200
 | ||||
| @@ -40,7 +40,7 @@ unless ($no_fips) {
 | ||||
|                   srctop_file("test", "recipes", "90-test_sslapi_data", | ||||
|                               "passwd.txt"), $tmpfilename, "fips", | ||||
|                   srctop_file("test", "fips-and-base.cnf")])), | ||||
| -                 "running sslapitest");
 | ||||
| +                 "running sslapitest - FIPS");
 | ||||
|  } | ||||
|   | ||||
|  unlink $tmpfilename; | ||||
| diff --git a/test/sslapitest.c b/test/sslapitest.c
 | ||||
| index e95d2657f46c..7af0eab3fce0 100644
 | ||||
| --- a/test/sslapitest.c
 | ||||
| +++ b/test/sslapitest.c
 | ||||
| @@ -1158,6 +1158,11 @@ static int execute_test_ktls(int cis_ktls, int sis_ktls,
 | ||||
|          goto end; | ||||
|      } | ||||
|   | ||||
| +    if (is_fips && strstr(cipher, "CHACHA") != NULL) {
 | ||||
| +        testresult = TEST_skip("CHACHA is not supported in FIPS");
 | ||||
| +        goto end;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      /* Create a session based on SHA-256 */ | ||||
|      if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(), | ||||
|                                         TLS_client_method(), | ||||
| @@ -1292,6 +1297,11 @@ static int execute_test_ktls_sendfile(int tls_version, const char *cipher)
 | ||||
|          goto end; | ||||
|      } | ||||
|   | ||||
| +    if (is_fips && strstr(cipher, "CHACHA") != NULL) {
 | ||||
| +        testresult = TEST_skip("CHACHA is not supported in FIPS");
 | ||||
| +        goto end;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      /* Create a session based on SHA-256 */ | ||||
|      if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(), | ||||
|                                         TLS_client_method(), | ||||
							
								
								
									
										161
									
								
								SOURCES/0032-Force-fips.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								SOURCES/0032-Force-fips.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,161 @@ | ||||
| #Note: provider_conf_activate() is introduced in downstream only. It is a rewrite | ||||
| #(partial) of the function provider_conf_load() under the 'if (activate) section. | ||||
| #If there is any change to this section, after deleting it in provider_conf_load() | ||||
| #ensure that you also add those changes to the provider_conf_activate() function. | ||||
| #additionally please add this check for cnf explicitly as shown below. | ||||
| #'ok = cnf ? provider_conf_params(prov, NULL, NULL, value, cnf) : 1;' | ||||
| diff -up openssl-3.0.1/crypto/provider_conf.c.fips-FORCE openssl-3.0.1/crypto/provider_conf.c
 | ||||
| --- openssl-3.0.1/crypto/provider_conf.c.fips-FORCE	2022-01-18 15:36:00.956141345 +0100
 | ||||
| +++ openssl-3.0.1/crypto/provider_conf.c	2022-01-18 15:42:36.345172203 +0100
 | ||||
| @@ -136,58 +136,18 @@ static int prov_already_activated(const
 | ||||
|      return 0; | ||||
|  } | ||||
| 
 | ||||
| -static int provider_conf_load(OSSL_LIB_CTX *libctx, const char *name,
 | ||||
| -                              const char *value, const CONF *cnf)
 | ||||
| +static int provider_conf_activate(OSSL_LIB_CTX *libctx,const char *name,
 | ||||
| +                                  const char *value, const char *path,
 | ||||
| +                                  int soft, const CONF *cnf)
 | ||||
|  { | ||||
| -    int i;
 | ||||
| -    STACK_OF(CONF_VALUE) *ecmds;
 | ||||
| -    int soft = 0;
 | ||||
| -    OSSL_PROVIDER *prov = NULL, *actual = NULL;
 | ||||
| -    const char *path = NULL;
 | ||||
| -    long activate = 0;
 | ||||
|      int ok = 0; | ||||
| -
 | ||||
| -    name = skip_dot(name);
 | ||||
| -    OSSL_TRACE1(CONF, "Configuring provider %s\n", name);
 | ||||
| -    /* Value is a section containing PROVIDER commands */
 | ||||
| -    ecmds = NCONF_get_section(cnf, value);
 | ||||
| -
 | ||||
| -    if (!ecmds) {
 | ||||
| -        ERR_raise_data(ERR_LIB_CRYPTO, CRYPTO_R_PROVIDER_SECTION_ERROR,
 | ||||
| -                       "section=%s not found", value);
 | ||||
| -        return 0;
 | ||||
| -    }
 | ||||
| -
 | ||||
| -    /* Find the needed data first */
 | ||||
| -    for (i = 0; i < sk_CONF_VALUE_num(ecmds); i++) {
 | ||||
| -        CONF_VALUE *ecmd = sk_CONF_VALUE_value(ecmds, i);
 | ||||
| -        const char *confname = skip_dot(ecmd->name);
 | ||||
| -        const char *confvalue = ecmd->value;
 | ||||
| -
 | ||||
| -        OSSL_TRACE2(CONF, "Provider command: %s = %s\n",
 | ||||
| -                    confname, confvalue);
 | ||||
| -
 | ||||
| -        /* First handle some special pseudo confs */
 | ||||
| -
 | ||||
| -        /* Override provider name to use */
 | ||||
| -        if (strcmp(confname, "identity") == 0)
 | ||||
| -            name = confvalue;
 | ||||
| -        else if (strcmp(confname, "soft_load") == 0)
 | ||||
| -            soft = 1;
 | ||||
| -        /* Load a dynamic PROVIDER */
 | ||||
| -        else if (strcmp(confname, "module") == 0)
 | ||||
| -            path = confvalue;
 | ||||
| -        else if (strcmp(confname, "activate") == 0)
 | ||||
| -            activate = 1;
 | ||||
| -    }
 | ||||
| -
 | ||||
| -    if (activate) {
 | ||||
| -        PROVIDER_CONF_GLOBAL *pcgbl
 | ||||
| -            = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_PROVIDER_CONF_INDEX,
 | ||||
| -                                    &provider_conf_ossl_ctx_method);
 | ||||
| +    OSSL_PROVIDER *prov = NULL, *actual = NULL;
 | ||||
| +    PROVIDER_CONF_GLOBAL *pcgbl
 | ||||
| +        = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_PROVIDER_CONF_INDEX,
 | ||||
| +                                &provider_conf_ossl_ctx_method);
 | ||||
|   | ||||
|          if (pcgbl == NULL || !CRYPTO_THREAD_write_lock(pcgbl->lock)) { | ||||
| -            ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR);
 | ||||
| +           ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR);
 | ||||
|              return 0; | ||||
|          } | ||||
|          if (!prov_already_activated(name, pcgbl->activated_providers)) { | ||||
| @@ -216,7 +176,7 @@ static int provider_conf_load(OSSL_LIB_C
 | ||||
|              if (path != NULL) | ||||
|                  ossl_provider_set_module_path(prov, path); | ||||
|   | ||||
| -            ok = provider_conf_params(prov, NULL, NULL, value, cnf);
 | ||||
| +            ok = cnf ? provider_conf_params(prov, NULL, NULL, value, cnf) : 1;
 | ||||
|   | ||||
|              if (ok) { | ||||
|                  if (!ossl_provider_activate(prov, 1, 0)) { | ||||
| @@ -246,6 +206,55 @@ static int provider_conf_load(OSSL_LIB_C
 | ||||
|                  ossl_provider_free(prov); | ||||
|          } | ||||
|          CRYPTO_THREAD_unlock(pcgbl->lock); | ||||
| +    return ok;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int provider_conf_load(OSSL_LIB_CTX *libctx, const char *name,
 | ||||
| +                              const char *value, const CONF *cnf)
 | ||||
| +{
 | ||||
| +    int i;
 | ||||
| +    STACK_OF(CONF_VALUE) *ecmds;
 | ||||
| +    int soft = 0;
 | ||||
| +    const char *path = NULL;
 | ||||
| +    long activate = 0;
 | ||||
| +    int ok = 0;
 | ||||
| +
 | ||||
| +    name = skip_dot(name);
 | ||||
| +    OSSL_TRACE1(CONF, "Configuring provider %s\n", name);
 | ||||
| +    /* Value is a section containing PROVIDER commands */
 | ||||
| +    ecmds = NCONF_get_section(cnf, value);
 | ||||
| +
 | ||||
| +    if (!ecmds) {
 | ||||
| +        ERR_raise_data(ERR_LIB_CRYPTO, CRYPTO_R_PROVIDER_SECTION_ERROR,
 | ||||
| +                       "section=%s not found", value);
 | ||||
| +        return 0;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    /* Find the needed data first */
 | ||||
| +    for (i = 0; i < sk_CONF_VALUE_num(ecmds); i++) {
 | ||||
| +        CONF_VALUE *ecmd = sk_CONF_VALUE_value(ecmds, i);
 | ||||
| +        const char *confname = skip_dot(ecmd->name);
 | ||||
| +        const char *confvalue = ecmd->value;
 | ||||
| +
 | ||||
| +        OSSL_TRACE2(CONF, "Provider command: %s = %s\n",
 | ||||
| +                    confname, confvalue);
 | ||||
| +
 | ||||
| +        /* First handle some special pseudo confs */
 | ||||
| +
 | ||||
| +        /* Override provider name to use */
 | ||||
| +        if (strcmp(confname, "identity") == 0)
 | ||||
| +            name = confvalue;
 | ||||
| +        else if (strcmp(confname, "soft_load") == 0)
 | ||||
| +            soft = 1;
 | ||||
| +        /* Load a dynamic PROVIDER */
 | ||||
| +        else if (strcmp(confname, "module") == 0)
 | ||||
| +            path = confvalue;
 | ||||
| +        else if (strcmp(confname, "activate") == 0)
 | ||||
| +            activate = 1;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    if (activate) {
 | ||||
| +       ok = provider_conf_activate(libctx, name, value, path, soft, cnf);
 | ||||
|      } else { | ||||
|          OSSL_PROVIDER_INFO entry; | ||||
|   | ||||
| @@ -306,6 +315,19 @@ static int provider_conf_init(CONF_IMODU
 | ||||
|              return 0; | ||||
|      } | ||||
|   | ||||
| +    if (ossl_get_kernel_fips_flag() != 0) { /* XXX from provider_conf_load */
 | ||||
| +        OSSL_LIB_CTX *libctx = NCONF_get0_libctx((CONF *)cnf);
 | ||||
| +        PROVIDER_CONF_GLOBAL *pcgbl
 | ||||
| +            = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_PROVIDER_CONF_INDEX,
 | ||||
| +                                    &provider_conf_ossl_ctx_method);
 | ||||
| +        if (provider_conf_activate(libctx, "fips", NULL, NULL, 0, NULL) != 1)
 | ||||
| +            return 0;
 | ||||
| +        if (provider_conf_activate(libctx, "base", NULL, NULL, 0, NULL) != 1)
 | ||||
| +            return 0;
 | ||||
| +        if (EVP_default_properties_enable_fips(libctx, 1) != 1)
 | ||||
| +            return 0;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      return 1; | ||||
|  } | ||||
|   | ||||
							
								
								
									
										223
									
								
								SOURCES/0033-FIPS-embed-hmac.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								SOURCES/0033-FIPS-embed-hmac.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,223 @@ | ||||
| diff -up openssl-3.0.0/providers/fips/self_test.c.embed-hmac openssl-3.0.0/providers/fips/self_test.c
 | ||||
| --- openssl-3.0.0/providers/fips/self_test.c.embed-hmac	2021-11-16 13:57:05.127171056 +0100
 | ||||
| +++ openssl-3.0.0/providers/fips/self_test.c	2021-11-16 14:07:21.963412455 +0100
 | ||||
| @@ -171,11 +171,27 @@ DEP_FINI_ATTRIBUTE void cleanup(void)
 | ||||
|  } | ||||
|  #endif | ||||
|   | ||||
| +#define HMAC_LEN 32
 | ||||
| +/*
 | ||||
| + * The __attribute__ ensures we've created the .rodata1 section
 | ||||
| + * static ensures it's zero filled
 | ||||
| +*/
 | ||||
| +static const unsigned char __attribute__ ((section (".rodata1"))) fips_hmac_container[HMAC_LEN] = {0};
 | ||||
| +
 | ||||
|  /* | ||||
|   * Calculate the HMAC SHA256 of data read using a BIO and read_cb, and verify | ||||
|   * the result matches the expected value. | ||||
|   * Return 1 if verified, or 0 if it fails. | ||||
|   */ | ||||
| +#ifndef __USE_GNU
 | ||||
| +#define __USE_GNU
 | ||||
| +#include <dlfcn.h>
 | ||||
| +#undef __USE_GNU
 | ||||
| +#else
 | ||||
| +#include <dlfcn.h>
 | ||||
| +#endif
 | ||||
| +#include <link.h>
 | ||||
| +
 | ||||
|  static int verify_integrity(OSSL_CORE_BIO *bio, OSSL_FUNC_BIO_read_ex_fn read_ex_cb, | ||||
|                              unsigned char *expected, size_t expected_len, | ||||
|                              OSSL_LIB_CTX *libctx, OSSL_SELF_TEST *ev, | ||||
| @@ -183,14 +199,26 @@ static int verify_integrity(OSSL_CORE_BI
 | ||||
|  { | ||||
|      int ret = 0, status; | ||||
|      unsigned char out[MAX_MD_SIZE]; | ||||
| -    unsigned char buf[INTEGRITY_BUF_SIZE];
 | ||||
| +    unsigned char buf[INTEGRITY_BUF_SIZE+HMAC_LEN];
 | ||||
|      size_t bytes_read = 0, out_len = 0; | ||||
|      EVP_MAC *mac = NULL; | ||||
|      EVP_MAC_CTX *ctx = NULL; | ||||
|      OSSL_PARAM params[2], *p = params; | ||||
| +    Dl_info info;
 | ||||
| +    void *extra_info = NULL;
 | ||||
| +    struct link_map *lm = NULL;
 | ||||
| +    unsigned long paddr;
 | ||||
| +    unsigned long off = 0;
 | ||||
| +    int have_rest = 0;
 | ||||
|   | ||||
|      OSSL_SELF_TEST_onbegin(ev, event_type, OSSL_SELF_TEST_DESC_INTEGRITY_HMAC); | ||||
|   | ||||
| +    if (!dladdr1 ((const void *)fips_hmac_container,
 | ||||
| +                &info, &extra_info, RTLD_DL_LINKMAP))
 | ||||
| +        goto err;
 | ||||
| +    lm = extra_info;
 | ||||
| +    paddr = (unsigned long)fips_hmac_container - lm->l_addr;
 | ||||
| +
 | ||||
|      mac = EVP_MAC_fetch(libctx, MAC_NAME, NULL); | ||||
|      if (mac == NULL) | ||||
|          goto err; | ||||
| @@ -204,12 +233,53 @@ static int verify_integrity(OSSL_CORE_BI
 | ||||
|      if (!EVP_MAC_init(ctx, fixed_key, sizeof(fixed_key), params)) | ||||
|          goto err; | ||||
|   | ||||
| +    status = read_ex_cb(bio, buf, HMAC_LEN, &bytes_read);
 | ||||
| +    if (status != 1 || bytes_read != HMAC_LEN)
 | ||||
| +        goto err;
 | ||||
| +    off += HMAC_LEN;
 | ||||
| +
 | ||||
|      while (1) { | ||||
| -        status = read_ex_cb(bio, buf, sizeof(buf), &bytes_read);
 | ||||
| -        if (status != 1)
 | ||||
| +        status = read_ex_cb(bio, buf+HMAC_LEN, INTEGRITY_BUF_SIZE, &bytes_read);
 | ||||
| +        if (status != 1) {
 | ||||
| +            have_rest = 1;
 | ||||
| +            break;
 | ||||
| +        }
 | ||||
| +
 | ||||
| +        if (bytes_read == INTEGRITY_BUF_SIZE) { /* Full block */
 | ||||
| +            /* Logic:
 | ||||
| +             * We have HMAC_LEN (read before) + INTEGRITY_BUF_SIZE (read now) in buffer
 | ||||
| +             * We calculate HMAC from first INTEGRITY_BUF_SIZE bytes
 | ||||
| +             * and move last HMAC_LEN bytes to the beginning of the buffer
 | ||||
| +             *
 | ||||
| +             * If we have read (a part of) buffer fips_hmac_container
 | ||||
| +             * we should replace it with zeros.
 | ||||
| +             * If it is inside our current buffer, we will update now.
 | ||||
| +             * If it intersects the upper bound, we will clean up on the next step.
 | ||||
| +             */
 | ||||
| +            if (off - HMAC_LEN <= paddr && paddr <= off + bytes_read)
 | ||||
| +                memset (buf + HMAC_LEN + paddr - off, 0, HMAC_LEN);
 | ||||
| +            off += bytes_read;
 | ||||
| +
 | ||||
| +            if (!EVP_MAC_update(ctx, buf, bytes_read))
 | ||||
| +                goto err;
 | ||||
| +            memcpy (buf, buf+INTEGRITY_BUF_SIZE, HMAC_LEN);
 | ||||
| +        } else { /* Final block */
 | ||||
| +            /* Logic is basically the same as in previous branch
 | ||||
| +             * but we calculate HMAC from HMAC_LEN (rest of previous step)
 | ||||
| +             * and bytes_read read on this step
 | ||||
| +             * */
 | ||||
| +            if (off - HMAC_LEN <= paddr && paddr <= off + bytes_read)
 | ||||
| +                memset (buf + HMAC_LEN + paddr - off, 0, HMAC_LEN);
 | ||||
| +            if (!EVP_MAC_update(ctx, buf, bytes_read+HMAC_LEN))
 | ||||
| +                goto err;
 | ||||
| +            off += bytes_read;
 | ||||
|              break; | ||||
| -        if (!EVP_MAC_update(ctx, buf, bytes_read))
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +    if (have_rest) {
 | ||||
| +        if (!EVP_MAC_update(ctx, buf, HMAC_LEN))
 | ||||
|              goto err; | ||||
| +        off += HMAC_LEN;
 | ||||
|      } | ||||
|      if (!EVP_MAC_final(ctx, out, &out_len, sizeof(out))) | ||||
|          goto err; | ||||
| @@ -284,8 +358,7 @@ int SELF_TEST_post(SELF_TEST_POST_PARAMS
 | ||||
|          CRYPTO_THREAD_unlock(fips_state_lock); | ||||
|      } | ||||
|   | ||||
| -    if (st == NULL
 | ||||
| -            || st->module_checksum_data == NULL) {
 | ||||
| +    if (st == NULL) {
 | ||||
|          ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_CONFIG_DATA); | ||||
|          goto end; | ||||
|      } | ||||
| @@ -294,8 +367,9 @@ int SELF_TEST_post(SELF_TEST_POST_PARAMS
 | ||||
|      if (ev == NULL) | ||||
|          goto end; | ||||
|   | ||||
| -    module_checksum = OPENSSL_hexstr2buf(st->module_checksum_data,
 | ||||
| -                                         &checksum_len);
 | ||||
| +    module_checksum = fips_hmac_container;
 | ||||
| +    checksum_len = sizeof(fips_hmac_container);
 | ||||
| +
 | ||||
|      if (module_checksum == NULL) { | ||||
|          ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_CONFIG_DATA); | ||||
|          goto end; | ||||
| @@ -357,7 +431,6 @@ int SELF_TEST_post(SELF_TEST_POST_PARAMS
 | ||||
|      ok = 1; | ||||
|  end: | ||||
|      OSSL_SELF_TEST_free(ev); | ||||
| -    OPENSSL_free(module_checksum);
 | ||||
|      OPENSSL_free(indicator_checksum); | ||||
|   | ||||
|      if (st != NULL) { | ||||
| diff -ruN openssl-3.0.0/test/recipes/00-prep_fipsmodule_cnf.t openssl-3.0.0-xxx/test/recipes/00-prep_fipsmodule_cnf.t
 | ||||
| --- openssl-3.0.0/test/recipes/00-prep_fipsmodule_cnf.t	2021-09-07 13:46:32.000000000 +0200
 | ||||
| +++ openssl-3.0.0-xxx/test/recipes/00-prep_fipsmodule_cnf.t	2021-11-18 09:39:53.386817874 +0100
 | ||||
| @@ -20,7 +20,7 @@
 | ||||
|  use lib bldtop_dir('.'); | ||||
|  use platform; | ||||
|   | ||||
| -my $no_check = disabled("fips");
 | ||||
| +my $no_check = 1;
 | ||||
|  plan skip_all => "FIPS module config file only supported in a fips build" | ||||
|      if $no_check; | ||||
|   | ||||
| diff -ruN openssl-3.0.0/test/recipes/01-test_fipsmodule_cnf.t openssl-3.0.0-xxx/test/recipes/01-test_fipsmodule_cnf.t
 | ||||
| --- openssl-3.0.0/test/recipes/01-test_fipsmodule_cnf.t	2021-09-07 13:46:32.000000000 +0200
 | ||||
| +++ openssl-3.0.0-xxx/test/recipes/01-test_fipsmodule_cnf.t	2021-11-18 09:59:02.315619486 +0100
 | ||||
| @@ -23,7 +23,7 @@
 | ||||
|  use lib bldtop_dir('.'); | ||||
|  use platform; | ||||
|   | ||||
| -my $no_check = disabled("fips");
 | ||||
| +my $no_check = 1;
 | ||||
|  plan skip_all => "Test only supported in a fips build" | ||||
|      if $no_check; | ||||
|  plan tests => 1; | ||||
| diff -ruN openssl-3.0.0/test/recipes/03-test_fipsinstall.t openssl-3.0.0-xxx/test/recipes/03-test_fipsinstall.t
 | ||||
| --- openssl-3.0.0/test/recipes/03-test_fipsinstall.t	2021-09-07 13:46:32.000000000 +0200
 | ||||
| +++ openssl-3.0.0-xxx/test/recipes/03-test_fipsinstall.t	2021-11-18 09:59:55.365072074 +0100
 | ||||
| @@ -22,7 +22,7 @@
 | ||||
|  use lib bldtop_dir('.'); | ||||
|  use platform; | ||||
|   | ||||
| -plan skip_all => "Test only supported in a fips build" if disabled("fips");
 | ||||
| +plan skip_all => "Test only supported in a fips build" if 1;
 | ||||
|   | ||||
|  plan tests => 29; | ||||
|   | ||||
| diff -ruN openssl-3.0.0/test/recipes/30-test_defltfips.t openssl-3.0.0-xxx/test/recipes/30-test_defltfips.t
 | ||||
| --- openssl-3.0.0/test/recipes/30-test_defltfips.t	2021-09-07 13:46:32.000000000 +0200
 | ||||
| +++ openssl-3.0.0-xxx/test/recipes/30-test_defltfips.t	2021-11-18 10:22:54.179659682 +0100
 | ||||
| @@ -21,7 +21,7 @@
 | ||||
|  use lib srctop_dir('Configurations'); | ||||
|  use lib bldtop_dir('.'); | ||||
|   | ||||
| -my $no_fips = disabled('fips') || ($ENV{NO_FIPS} // 0);
 | ||||
| +my $no_fips = 1; #disabled('fips') || ($ENV{NO_FIPS} // 0);
 | ||||
|   | ||||
|  plan tests => | ||||
|      ($no_fips ? 1 : 5); | ||||
| diff -ruN openssl-3.0.0/test/recipes/80-test_ssl_new.t openssl-3.0.0-xxx/test/recipes/80-test_ssl_new.t
 | ||||
| --- openssl-3.0.0/test/recipes/80-test_ssl_new.t	2021-09-07 13:46:32.000000000 +0200
 | ||||
| +++ openssl-3.0.0-xxx/test/recipes/80-test_ssl_new.t	2021-11-18 10:18:53.391721164 +0100
 | ||||
| @@ -23,7 +23,7 @@
 | ||||
|  use lib srctop_dir('Configurations'); | ||||
|  use lib bldtop_dir('.'); | ||||
|   | ||||
| -my $no_fips = disabled('fips') || ($ENV{NO_FIPS} // 0);
 | ||||
| +my $no_fips = 1; #disabled('fips') || ($ENV{NO_FIPS} // 0);
 | ||||
|   | ||||
|  $ENV{TEST_CERTS_DIR} = srctop_dir("test", "certs"); | ||||
|   | ||||
| diff -ruN openssl-3.0.0/test/recipes/90-test_sslapi.t openssl-3.0.0-xxx/test/recipes/90-test_sslapi.t
 | ||||
| --- openssl-3.0.0/test/recipes/90-test_sslapi.t	2021-11-18 10:32:17.734196705 +0100
 | ||||
| +++ openssl-3.0.0-xxx/test/recipes/90-test_sslapi.t	2021-11-18 10:18:30.695538445 +0100
 | ||||
| @@ -18,7 +18,7 @@
 | ||||
|  use lib srctop_dir('Configurations'); | ||||
|  use lib bldtop_dir('.'); | ||||
|   | ||||
| -my $no_fips = disabled('fips') || ($ENV{NO_FIPS} // 0);
 | ||||
| +my $no_fips = 1; #disabled('fips') || ($ENV{NO_FIPS} // 0);
 | ||||
|   | ||||
|  plan skip_all => "No TLS/SSL protocols are supported by this OpenSSL build" | ||||
|      if alldisabled(grep { $_ ne "ssl3" } available_protocols("tls")); | ||||
| --- /dev/null	2021-11-16 15:27:32.915000000 +0100
 | ||||
| +++ openssl-3.0.0/test/fipsmodule.cnf	2021-11-18 11:15:34.538060408 +0100
 | ||||
| @@ -0,0 +1,2 @@
 | ||||
| +[fips_sect]
 | ||||
| +activate = 1
 | ||||
							
								
								
									
										406
									
								
								SOURCES/0034.fipsinstall_disable.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										406
									
								
								SOURCES/0034.fipsinstall_disable.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,406 @@ | ||||
| diff -up openssl-3.0.0/apps/fipsinstall.c.xxx openssl-3.0.0/apps/fipsinstall.c
 | ||||
| --- openssl-3.0.0/apps/fipsinstall.c.xxx	2021-11-22 13:09:28.232560235 +0100
 | ||||
| +++ openssl-3.0.0/apps/fipsinstall.c	2021-11-22 13:12:22.272058910 +0100
 | ||||
| @@ -311,6 +311,9 @@ int fipsinstall_main(int argc, char **ar
 | ||||
|      EVP_MAC *mac = NULL; | ||||
|      CONF *conf = NULL; | ||||
|   | ||||
| +    BIO_printf(bio_err, "This command is not enabled in the Red Hat Enterprise Linux OpenSSL build, please consult Red Hat documentation to learn how to enable FIPS mode\n");
 | ||||
| +    return 1;
 | ||||
| +
 | ||||
|      if ((opts = sk_OPENSSL_STRING_new_null()) == NULL) | ||||
|          goto end; | ||||
|   | ||||
| diff -up openssl-3.0.0/doc/man1/openssl.pod.xxx openssl-3.0.0/doc/man1/openssl.pod
 | ||||
| --- openssl-3.0.0/doc/man1/openssl.pod.xxx	2021-11-22 13:18:51.081406990 +0100
 | ||||
| +++ openssl-3.0.0/doc/man1/openssl.pod	2021-11-22 13:19:02.897508738 +0100
 | ||||
| @@ -158,10 +158,6 @@ Engine (loadable module) information and
 | ||||
|   | ||||
|  Error Number to Error String Conversion. | ||||
|   | ||||
| -=item B<fipsinstall>
 | ||||
| -
 | ||||
| -FIPS configuration installation.
 | ||||
| -
 | ||||
|  =item B<gendsa> | ||||
|   | ||||
|  Generation of DSA Private Key from Parameters. Superseded by | ||||
| diff -up openssl-3.0.0/doc/man5/config.pod.xxx openssl-3.0.0/doc/man5/config.pod
 | ||||
| --- openssl-3.0.0/doc/man5/config.pod.xxx	2021-11-22 13:24:51.359509501 +0100
 | ||||
| +++ openssl-3.0.0/doc/man5/config.pod	2021-11-22 13:26:02.360121820 +0100
 | ||||
| @@ -573,7 +573,6 @@ configuration files using that syntax wi
 | ||||
|  =head1 SEE ALSO | ||||
|   | ||||
|  L<openssl-x509(1)>, L<openssl-req(1)>, L<openssl-ca(1)>, | ||||
| -L<openssl-fipsinstall(1)>,
 | ||||
|  L<ASN1_generate_nconf(3)>, | ||||
|  L<EVP_set_default_properties(3)>, | ||||
|  L<CONF_modules_load(3)>, | ||||
| diff -up openssl-3.0.0/doc/man5/fips_config.pod.xxx openssl-3.0.0/doc/man5/fips_config.pod
 | ||||
| --- openssl-3.0.0/doc/man5/fips_config.pod.xxx	2021-11-22 13:21:13.812636065 +0100
 | ||||
| +++ openssl-3.0.0/doc/man5/fips_config.pod	2021-11-22 13:24:12.278172847 +0100
 | ||||
| @@ -6,106 +6,10 @@ fips_config - OpenSSL FIPS configuration
 | ||||
|   | ||||
|  =head1 DESCRIPTION | ||||
|   | ||||
| -A separate configuration file, using the OpenSSL L<config(5)> syntax,
 | ||||
| -is used to hold information about the FIPS module. This includes a digest
 | ||||
| -of the shared library file, and status about the self-testing.
 | ||||
| -This data is used automatically by the module itself for two
 | ||||
| -purposes:
 | ||||
| -
 | ||||
| -=over 4
 | ||||
| -
 | ||||
| -=item - Run the startup FIPS self-test known answer tests (KATS).
 | ||||
| -
 | ||||
| -This is normally done once, at installation time, but may also be set up to
 | ||||
| -run each time the module is used.
 | ||||
| -
 | ||||
| -=item - Verify the module's checksum.
 | ||||
| -
 | ||||
| -This is done each time the module is used.
 | ||||
| -
 | ||||
| -=back
 | ||||
| -
 | ||||
| -This file is generated by the L<openssl-fipsinstall(1)> program, and
 | ||||
| -used internally by the FIPS module during its initialization.
 | ||||
| -
 | ||||
| -The following options are supported. They should all appear in a section
 | ||||
| -whose name is identified by the B<fips> option in the B<providers>
 | ||||
| -section, as described in L<config(5)/Provider Configuration Module>.
 | ||||
| -
 | ||||
| -=over 4
 | ||||
| -
 | ||||
| -=item B<activate>
 | ||||
| -
 | ||||
| -If present, the module is activated. The value assigned to this name is not
 | ||||
| -significant.
 | ||||
| -
 | ||||
| -=item B<install-version>
 | ||||
| -
 | ||||
| -A version number for the fips install process. Should be 1.
 | ||||
| -
 | ||||
| -=item B<conditional-errors>
 | ||||
| -
 | ||||
| -The FIPS module normally enters an internal error mode if any self test fails.
 | ||||
| -Once this error mode is active, no services or cryptographic algorithms are
 | ||||
| -accessible from this point on.
 | ||||
| -Continuous tests are a subset of the self tests (e.g., a key pair test during key
 | ||||
| -generation, or the CRNG output test).
 | ||||
| -Setting this value to C<0> allows the error mode to not be triggered if any
 | ||||
| -continuous test fails. The default value of C<1> will trigger the error mode.
 | ||||
| -Regardless of the value, the operation (e.g., key generation) that called the
 | ||||
| -continuous test will return an error code if its continuous test fails. The
 | ||||
| -operation may then be retried if the error mode has not been triggered.
 | ||||
| -
 | ||||
| -=item B<security-checks>
 | ||||
| -
 | ||||
| -This indicates if run-time checks related to enforcement of security parameters
 | ||||
| -such as minimum security strength of keys and approved curve names are used.
 | ||||
| -A value of '1' will perform the checks, otherwise if the value is '0' the checks
 | ||||
| -are not performed and FIPS compliance must be done by procedures documented in
 | ||||
| -the relevant Security Policy.
 | ||||
| -
 | ||||
| -=item B<module-mac>
 | ||||
| -
 | ||||
| -The calculated MAC of the FIPS provider file.
 | ||||
| -
 | ||||
| -=item B<install-status>
 | ||||
| -
 | ||||
| -An indicator that the self-tests were successfully run.
 | ||||
| -This should only be written after the module has
 | ||||
| -successfully passed its self tests during installation.
 | ||||
| -If this field is not present, then the self tests will run when the module
 | ||||
| -loads.
 | ||||
| -
 | ||||
| -=item B<install-mac>
 | ||||
| -
 | ||||
| -A MAC of the value of the B<install-status> option, to prevent accidental
 | ||||
| -changes to that value.
 | ||||
| -It is written-to at the same time as B<install-status> is updated.
 | ||||
| -
 | ||||
| -=back
 | ||||
| -
 | ||||
| -For example:
 | ||||
| -
 | ||||
| - [fips_sect]
 | ||||
| - activate = 1
 | ||||
| - install-version = 1
 | ||||
| - conditional-errors = 1
 | ||||
| - security-checks = 1
 | ||||
| - module-mac = 41:D0:FA:C2:5D:41:75:CD:7D:C3:90:55:6F:A4:DC
 | ||||
| - install-mac = FE:10:13:5A:D3:B4:C7:82:1B:1E:17:4C:AC:84:0C
 | ||||
| - install-status = INSTALL_SELF_TEST_KATS_RUN
 | ||||
| -
 | ||||
| -=head1 NOTES
 | ||||
| -
 | ||||
| -When using the FIPS provider, it is recommended that the
 | ||||
| -B<config_diagnostics> option is enabled to prevent accidental use of
 | ||||
| -non-FIPS validated algorithms via broken or mistaken configuration.
 | ||||
| -See L<config(5)>.
 | ||||
| -
 | ||||
| -=head1 SEE ALSO
 | ||||
| -
 | ||||
| -L<config(5)>
 | ||||
| -L<openssl-fipsinstall(1)>
 | ||||
| +This command is disabled in Red Hat Enterprise Linux. The FIPS provider is
 | ||||
| +automatically loaded when the system is booted in FIPS mode, or when the
 | ||||
| +environment variable B<OPENSSL_FORCE_FIPS_MODE> is set. See the documentation
 | ||||
| +for more information.
 | ||||
|   | ||||
|  =head1 COPYRIGHT | ||||
|   | ||||
| diff -up openssl-3.0.0/doc/man7/OSSL_PROVIDER-FIPS.pod.xxx openssl-3.0.0/doc/man7/OSSL_PROVIDER-FIPS.pod
 | ||||
| --- openssl-3.0.0/doc/man7/OSSL_PROVIDER-FIPS.pod.xxx	2021-11-22 13:18:13.850086386 +0100
 | ||||
| +++ openssl-3.0.0/doc/man7/OSSL_PROVIDER-FIPS.pod	2021-11-22 13:18:24.607179038 +0100
 | ||||
| @@ -388,7 +388,6 @@ A simple self test callback is shown bel
 | ||||
|   | ||||
|  =head1 SEE ALSO | ||||
|   | ||||
| -L<openssl-fipsinstall(1)>,
 | ||||
|  L<fips_config(5)>, | ||||
|  L<OSSL_SELF_TEST_set_callback(3)>, | ||||
|  L<OSSL_SELF_TEST_new(3)>, | ||||
| diff -up openssl-3.0.1/doc/man1/openssl-fipsinstall.pod.in.embed-hmac openssl-3.0.1/doc/man1/openssl-fipsinstall.pod.in
 | ||||
| --- openssl-3.0.1/doc/man1/openssl-fipsinstall.pod.in.embed-hmac	2022-01-11 13:26:33.279906225 +0100
 | ||||
| +++ openssl-3.0.1/doc/man1/openssl-fipsinstall.pod.in	2022-01-11 13:33:18.757994419 +0100
 | ||||
| @@ -8,236 +8,11 @@ openssl-fipsinstall - perform FIPS confi
 | ||||
|  =head1 SYNOPSIS | ||||
|   | ||||
|  B<openssl fipsinstall> | ||||
| -[B<-help>]
 | ||||
| -[B<-in> I<configfilename>]
 | ||||
| -[B<-out> I<configfilename>]
 | ||||
| -[B<-module> I<modulefilename>]
 | ||||
| -[B<-provider_name> I<providername>]
 | ||||
| -[B<-section_name> I<sectionname>]
 | ||||
| -[B<-verify>]
 | ||||
| -[B<-mac_name> I<macname>]
 | ||||
| -[B<-macopt> I<nm>:I<v>]
 | ||||
| -[B<-noout>]
 | ||||
| -[B<-quiet>]
 | ||||
| -[B<-no_conditional_errors>]
 | ||||
| -[B<-no_security_checks>]
 | ||||
| -[B<-self_test_onload>]
 | ||||
| -[B<-corrupt_desc> I<selftest_description>]
 | ||||
| -[B<-corrupt_type> I<selftest_type>]
 | ||||
| -[B<-config> I<parent_config>]
 | ||||
|   | ||||
|  =head1 DESCRIPTION | ||||
| -
 | ||||
| -This command is used to generate a FIPS module configuration file.
 | ||||
| -This configuration file can be used each time a FIPS module is loaded
 | ||||
| -in order to pass data to the FIPS module self tests. The FIPS module always
 | ||||
| -verifies its MAC, but optionally only needs to run the KAT's once,
 | ||||
| -at installation.
 | ||||
| -
 | ||||
| -The generated configuration file consists of:
 | ||||
| -
 | ||||
| -=over 4
 | ||||
| -
 | ||||
| -=item - A MAC of the FIPS module file.
 | ||||
| -
 | ||||
| -=item - A test status indicator.
 | ||||
| -
 | ||||
| -This indicates if the Known Answer Self Tests (KAT's) have successfully run.
 | ||||
| -
 | ||||
| -=item - A MAC of the status indicator.
 | ||||
| -
 | ||||
| -=item - A control for conditional self tests errors.
 | ||||
| -
 | ||||
| -By default if a continuous test (e.g a key pair test) fails then the FIPS module
 | ||||
| -will enter an error state, and no services or cryptographic algorithms will be
 | ||||
| -able to be accessed after this point.
 | ||||
| -The default value of '1' will cause the fips module error state to be entered.
 | ||||
| -If the value is '0' then the module error state will not be entered.
 | ||||
| -Regardless of whether the error state is entered or not, the current operation
 | ||||
| -(e.g. key generation) will return an error. The user is responsible for retrying
 | ||||
| -the operation if the module error state is not entered.
 | ||||
| -
 | ||||
| -=item - A control to indicate whether run-time security checks are done.
 | ||||
| -
 | ||||
| -This indicates if run-time checks related to enforcement of security parameters
 | ||||
| -such as minimum security strength of keys and approved curve names are used.
 | ||||
| -The default value of '1' will perform the checks.
 | ||||
| -If the value is '0' the checks are not performed and FIPS compliance must
 | ||||
| -be done by procedures documented in the relevant Security Policy.
 | ||||
| -
 | ||||
| -=back
 | ||||
| -
 | ||||
| -This file is described in L<fips_config(5)>.
 | ||||
| -
 | ||||
| -=head1 OPTIONS
 | ||||
| -
 | ||||
| -=over 4
 | ||||
| -
 | ||||
| -=item B<-help>
 | ||||
| -
 | ||||
| -Print a usage message.
 | ||||
| -
 | ||||
| -=item B<-module> I<filename>
 | ||||
| -
 | ||||
| -Filename of the FIPS module to perform an integrity check on.
 | ||||
| -The path provided in the filename is used to load the module when it is
 | ||||
| -activated, and this overrides the environment variable B<OPENSSL_MODULES>.
 | ||||
| -
 | ||||
| -=item B<-out> I<configfilename>
 | ||||
| -
 | ||||
| -Filename to output the configuration data to; the default is standard output.
 | ||||
| -
 | ||||
| -=item B<-in> I<configfilename>
 | ||||
| -
 | ||||
| -Input filename to load configuration data from.
 | ||||
| -Must be used if the B<-verify> option is specified.
 | ||||
| -
 | ||||
| -=item B<-verify>
 | ||||
| -
 | ||||
| -Verify that the input configuration file contains the correct information.
 | ||||
| -
 | ||||
| -=item B<-provider_name> I<providername>
 | ||||
| -
 | ||||
| -Name of the provider inside the configuration file.
 | ||||
| -The default value is C<fips>.
 | ||||
| -
 | ||||
| -=item B<-section_name> I<sectionname>
 | ||||
| -
 | ||||
| -Name of the section inside the configuration file.
 | ||||
| -The default value is C<fips_sect>.
 | ||||
| -
 | ||||
| -=item B<-mac_name> I<name>
 | ||||
| -
 | ||||
| -Specifies the name of a supported MAC algorithm which will be used.
 | ||||
| -The MAC mechanisms that are available will depend on the options
 | ||||
| -used when building OpenSSL.
 | ||||
| -To see the list of supported MAC's use the command
 | ||||
| -C<openssl list -mac-algorithms>.  The default is B<HMAC>.
 | ||||
| -
 | ||||
| -=item B<-macopt> I<nm>:I<v>
 | ||||
| -
 | ||||
| -Passes options to the MAC algorithm.
 | ||||
| -A comprehensive list of controls can be found in the EVP_MAC implementation
 | ||||
| -documentation.
 | ||||
| -Common control strings used for this command are:
 | ||||
| -
 | ||||
| -=over 4
 | ||||
| -
 | ||||
| -=item B<key>:I<string>
 | ||||
| -
 | ||||
| -Specifies the MAC key as an alphanumeric string (use if the key contains
 | ||||
| -printable characters only).
 | ||||
| -The string length must conform to any restrictions of the MAC algorithm.
 | ||||
| -A key must be specified for every MAC algorithm.
 | ||||
| -If no key is provided, the default that was specified when OpenSSL was
 | ||||
| -configured is used.
 | ||||
| -
 | ||||
| -=item B<hexkey>:I<string>
 | ||||
| -
 | ||||
| -Specifies the MAC key in hexadecimal form (two hex digits per byte).
 | ||||
| -The key length must conform to any restrictions of the MAC algorithm.
 | ||||
| -A key must be specified for every MAC algorithm.
 | ||||
| -If no key is provided, the default that was specified when OpenSSL was
 | ||||
| -configured is used.
 | ||||
| -
 | ||||
| -=item B<digest>:I<string>
 | ||||
| -
 | ||||
| -Used by HMAC as an alphanumeric string (use if the key contains printable
 | ||||
| -characters only).
 | ||||
| -The string length must conform to any restrictions of the MAC algorithm.
 | ||||
| -To see the list of supported digests, use the command
 | ||||
| -C<openssl list -digest-commands>.
 | ||||
| -The default digest is SHA-256.
 | ||||
| -
 | ||||
| -=back
 | ||||
| -
 | ||||
| -=item B<-noout>
 | ||||
| -
 | ||||
| -Disable logging of the self tests.
 | ||||
| -
 | ||||
| -=item B<-no_conditional_errors>
 | ||||
| -
 | ||||
| -Configure the module to not enter an error state if a conditional self test
 | ||||
| -fails as described above.
 | ||||
| -
 | ||||
| -=item B<-no_security_checks>
 | ||||
| -
 | ||||
| -Configure the module to not perform run-time security checks as described above.
 | ||||
| -
 | ||||
| -=item B<-self_test_onload>
 | ||||
| -
 | ||||
| -Do not write the two fields related to the "test status indicator" and
 | ||||
| -"MAC status indicator" to the output configuration file. Without these fields
 | ||||
| -the self tests KATS will run each time the module is loaded. This option could be
 | ||||
| -used for cross compiling, since the self tests need to run at least once on each
 | ||||
| -target machine. Once the self tests have run on the target machine the user
 | ||||
| -could possibly then add the 2 fields into the configuration using some other
 | ||||
| -mechanism.
 | ||||
| -
 | ||||
| -=item B<-quiet>
 | ||||
| -
 | ||||
| -Do not output pass/fail messages. Implies B<-noout>.
 | ||||
| -
 | ||||
| -=item B<-corrupt_desc> I<selftest_description>,
 | ||||
| -B<-corrupt_type> I<selftest_type>
 | ||||
| -
 | ||||
| -The corrupt options can be used to test failure of one or more self tests by
 | ||||
| -name.
 | ||||
| -Either option or both may be used to select the tests to corrupt.
 | ||||
| -Refer to the entries for B<st-desc> and B<st-type> in L<OSSL_PROVIDER-FIPS(7)> for
 | ||||
| -values that can be used.
 | ||||
| -
 | ||||
| -=item B<-config> I<parent_config>
 | ||||
| -
 | ||||
| -Test that a FIPS provider can be loaded from the specified configuration file.
 | ||||
| -A previous call to this application needs to generate the extra configuration
 | ||||
| -data that is included by the base C<parent_config> configuration file.
 | ||||
| -See L<config(5)> for further information on how to set up a provider section.
 | ||||
| -All other options are ignored if '-config' is used.
 | ||||
| -
 | ||||
| -=back
 | ||||
| -
 | ||||
| -=head1 NOTES
 | ||||
| -
 | ||||
| -Self tests results are logged by default if the options B<-quiet> and B<-noout>
 | ||||
| -are not specified, or if either of the options B<-corrupt_desc> or
 | ||||
| -B<-corrupt_type> are used.
 | ||||
| -If the base configuration file is set up to autoload the fips module, then the
 | ||||
| -fips module will be loaded and self tested BEFORE the fipsinstall application
 | ||||
| -has a chance to set up its own self test callback. As a result of this the self
 | ||||
| -test output and the options B<-corrupt_desc> and B<-corrupt_type> will be ignored.
 | ||||
| -For normal usage the base configuration file should use the default provider
 | ||||
| -when generating the fips configuration file.
 | ||||
| -
 | ||||
| -=head1 EXAMPLES
 | ||||
| -
 | ||||
| -Calculate the mac of a FIPS module F<fips.so> and run a FIPS self test
 | ||||
| -for the module, and save the F<fips.cnf> configuration file:
 | ||||
| -
 | ||||
| - openssl fipsinstall -module ./fips.so -out fips.cnf -provider_name fips
 | ||||
| -
 | ||||
| -Verify that the configuration file F<fips.cnf> contains the correct info:
 | ||||
| -
 | ||||
| - openssl fipsinstall -module ./fips.so -in fips.cnf  -provider_name fips -verify
 | ||||
| -
 | ||||
| -Corrupt any self tests which have the description C<SHA1>:
 | ||||
| -
 | ||||
| - openssl fipsinstall -module ./fips.so -out fips.cnf -provider_name fips \
 | ||||
| -         -corrupt_desc 'SHA1'
 | ||||
| -
 | ||||
| -Validate that the fips module can be loaded from a base configuration file:
 | ||||
| -
 | ||||
| - export OPENSSL_CONF_INCLUDE=<path of configuration files>
 | ||||
| - export OPENSSL_MODULES=<provider-path>
 | ||||
| - openssl fipsinstall -config' 'default.cnf'
 | ||||
| -
 | ||||
| -
 | ||||
| -=head1 SEE ALSO
 | ||||
| -
 | ||||
| -L<config(5)>,
 | ||||
| -L<fips_config(5)>,
 | ||||
| -L<OSSL_PROVIDER-FIPS(7)>,
 | ||||
| -L<EVP_MAC(3)>
 | ||||
| +This command is disabled.
 | ||||
| +Please consult Red Hat Enterprise Linux documentation to learn how to correctly
 | ||||
| +enable FIPS mode on Red Hat Enterprise
 | ||||
|   | ||||
|  =head1 COPYRIGHT | ||||
|   | ||||
							
								
								
									
										26
									
								
								SOURCES/0035-speed-skip-unavailable-dgst.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								SOURCES/0035-speed-skip-unavailable-dgst.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| diff -up openssl-3.0.0/apps/speed.c.beldmit openssl-3.0.0/apps/speed.c
 | ||||
| --- openssl-3.0.0/apps/speed.c.beldmit	2021-12-21 15:14:04.210431584 +0100
 | ||||
| +++ openssl-3.0.0/apps/speed.c	2021-12-21 15:46:05.554085125 +0100
 | ||||
| @@ -547,6 +547,9 @@ static int EVP_MAC_loop(int algindex, vo
 | ||||
|      for (count = 0; COND(c[algindex][testnum]); count++) { | ||||
|          size_t outl; | ||||
|   | ||||
| +        if (mctx == NULL)
 | ||||
| +            return -1;
 | ||||
| +
 | ||||
|          if (!EVP_MAC_init(mctx, NULL, 0, NULL) | ||||
|              || !EVP_MAC_update(mctx, buf, lengths[testnum]) | ||||
|              || !EVP_MAC_final(mctx, mac, &outl, sizeof(mac))) | ||||
| @@ -1922,8 +1925,10 @@ int speed_main(int argc, char **argv)
 | ||||
|              if (loopargs[i].mctx == NULL) | ||||
|                  goto end; | ||||
|   | ||||
| -            if (!EVP_MAC_CTX_set_params(loopargs[i].mctx, params))
 | ||||
| -                goto end;
 | ||||
| +            if (!EVP_MAC_CTX_set_params(loopargs[i].mctx, params)) {
 | ||||
| +                EVP_MAC_CTX_free(loopargs[i].mctx);
 | ||||
| +                loopargs[i].mctx = NULL;
 | ||||
| +            }
 | ||||
|          } | ||||
|          for (testnum = 0; testnum < size_num; testnum++) { | ||||
|              print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum], | ||||
							
								
								
									
										137
									
								
								SOURCES/0045-FIPS-services-minimize.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								SOURCES/0045-FIPS-services-minimize.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,137 @@ | ||||
| diff -up openssl-3.0.0/providers/fips/fipsprov.c.fipsmin openssl-3.0.0/providers/fips/fipsprov.c
 | ||||
| --- openssl-3.0.0/providers/fips/fipsprov.c.fipsmin	2022-01-12 17:17:42.574377550 +0100
 | ||||
| +++ openssl-3.0.0/providers/fips/fipsprov.c	2022-01-12 17:19:57.590598279 +0100
 | ||||
| @@ -37,6 +37,9 @@ static OSSL_FUNC_provider_query_operatio
 | ||||
|   | ||||
|  #define ALGC(NAMES, FUNC, CHECK) { { NAMES, FIPS_DEFAULT_PROPERTIES, FUNC }, CHECK } | ||||
|  #define ALG(NAMES, FUNC) ALGC(NAMES, FUNC, NULL) | ||||
| +#define ALGCU(NAMES, FUNC, CHECK) { { NAMES, FIPS_UNAPPROVED_PROPERTIES, FUNC }, CHECK }
 | ||||
| +#define ALGU(NAMES, FUNC) ALGCU(NAMES, FUNC, NULL)
 | ||||
| +
 | ||||
|   | ||||
|  extern OSSL_FUNC_core_thread_start_fn *c_thread_start; | ||||
|  int FIPS_security_check_enabled(OSSL_LIB_CTX *libctx); | ||||
| @@ -177,13 +177,13 @@ static int fips_get_params(void *provctx
 | ||||
|                                                &fips_prov_ossl_ctx_method); | ||||
|   | ||||
|      p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME); | ||||
| -    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "OpenSSL FIPS Provider"))
 | ||||
| +    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "Red Hat Enterprise Linux 9 - OpenSSL FIPS Provider"))
 | ||||
|          return 0; | ||||
|      p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_VERSION); | ||||
| -    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_VERSION_STR))
 | ||||
| +    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, REDHAT_FIPS_VERSION))
 | ||||
|          return 0; | ||||
|      p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_BUILDINFO); | ||||
| -    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_FULL_VERSION_STR))
 | ||||
| +    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, REDHAT_FIPS_VERSION))
 | ||||
|          return 0; | ||||
|      p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_STATUS); | ||||
|      if (p != NULL && !OSSL_PARAM_set_int(p, ossl_prov_is_running())) | ||||
| @@ -264,9 +267,9 @@ static const OSSL_ALGORITHM fips_digests
 | ||||
|       * KECCAK-KMAC-128 and KECCAK-KMAC-256 as hashes are mostly useful for | ||||
|       * KMAC128 and KMAC256. | ||||
|       */ | ||||
| -    { PROV_NAMES_KECCAK_KMAC_128, FIPS_DEFAULT_PROPERTIES,
 | ||||
| +    { PROV_NAMES_KECCAK_KMAC_128, FIPS_UNAPPROVED_PROPERTIES,
 | ||||
|        ossl_keccak_kmac_128_functions }, | ||||
| -    { PROV_NAMES_KECCAK_KMAC_256, FIPS_DEFAULT_PROPERTIES,
 | ||||
| +    { PROV_NAMES_KECCAK_KMAC_256, FIPS_UNAPPROVED_PROPERTIES,
 | ||||
|        ossl_keccak_kmac_256_functions }, | ||||
|      { NULL, NULL, NULL } | ||||
|  }; | ||||
| @@ -326,8 +329,8 @@ static const OSSL_ALGORITHM_CAPABLE fips
 | ||||
|      ALGC(PROV_NAMES_AES_256_CBC_HMAC_SHA256, ossl_aes256cbc_hmac_sha256_functions, | ||||
|           ossl_cipher_capable_aes_cbc_hmac_sha256), | ||||
|  #ifndef OPENSSL_NO_DES | ||||
| -    ALG(PROV_NAMES_DES_EDE3_ECB, ossl_tdes_ede3_ecb_functions),
 | ||||
| -    ALG(PROV_NAMES_DES_EDE3_CBC, ossl_tdes_ede3_cbc_functions),
 | ||||
| +    ALGU(PROV_NAMES_DES_EDE3_ECB, ossl_tdes_ede3_ecb_functions),
 | ||||
| +    ALGU(PROV_NAMES_DES_EDE3_CBC, ossl_tdes_ede3_cbc_functions),
 | ||||
|  #endif  /* OPENSSL_NO_DES */ | ||||
|      { { NULL, NULL, NULL }, NULL } | ||||
|  }; | ||||
| @@ -339,8 +342,8 @@ static const OSSL_ALGORITHM fips_macs[]
 | ||||
|  #endif | ||||
|      { PROV_NAMES_GMAC, FIPS_DEFAULT_PROPERTIES, ossl_gmac_functions }, | ||||
|      { PROV_NAMES_HMAC, FIPS_DEFAULT_PROPERTIES, ossl_hmac_functions }, | ||||
| -    { PROV_NAMES_KMAC_128, FIPS_DEFAULT_PROPERTIES, ossl_kmac128_functions },
 | ||||
| -    { PROV_NAMES_KMAC_256, FIPS_DEFAULT_PROPERTIES, ossl_kmac256_functions },
 | ||||
| +    { PROV_NAMES_KMAC_128, FIPS_UNAPPROVED_PROPERTIES, ossl_kmac128_functions },
 | ||||
| +    { PROV_NAMES_KMAC_256, FIPS_UNAPPROVED_PROPERTIES, ossl_kmac256_functions },
 | ||||
|      { NULL, NULL, NULL } | ||||
|  }; | ||||
|   | ||||
| @@ -375,8 +378,8 @@ static const OSSL_ALGORITHM fips_keyexch
 | ||||
|  #endif | ||||
|  #ifndef OPENSSL_NO_EC | ||||
|      { PROV_NAMES_ECDH, FIPS_DEFAULT_PROPERTIES, ossl_ecdh_keyexch_functions }, | ||||
| -    { PROV_NAMES_X25519, FIPS_DEFAULT_PROPERTIES, ossl_x25519_keyexch_functions },
 | ||||
| -    { PROV_NAMES_X448, FIPS_DEFAULT_PROPERTIES, ossl_x448_keyexch_functions },
 | ||||
| +    { PROV_NAMES_X25519, FIPS_UNAPPROVED_PROPERTIES, ossl_x25519_keyexch_functions },
 | ||||
| +    { PROV_NAMES_X448, FIPS_UNAPPROVED_PROPERTIES, ossl_x448_keyexch_functions },
 | ||||
|  #endif | ||||
|      { PROV_NAMES_TLS1_PRF, FIPS_DEFAULT_PROPERTIES, | ||||
|        ossl_kdf_tls1_prf_keyexch_functions }, | ||||
| @@ -386,12 +389,12 @@ static const OSSL_ALGORITHM fips_keyexch
 | ||||
|   | ||||
|  static const OSSL_ALGORITHM fips_signature[] = { | ||||
|  #ifndef OPENSSL_NO_DSA | ||||
| -    { PROV_NAMES_DSA, FIPS_DEFAULT_PROPERTIES, ossl_dsa_signature_functions },
 | ||||
| +    { PROV_NAMES_DSA, FIPS_UNAPPROVED_PROPERTIES, ossl_dsa_signature_functions },
 | ||||
|  #endif | ||||
|      { PROV_NAMES_RSA, FIPS_DEFAULT_PROPERTIES, ossl_rsa_signature_functions }, | ||||
|  #ifndef OPENSSL_NO_EC | ||||
| -    { PROV_NAMES_ED25519, FIPS_DEFAULT_PROPERTIES, ossl_ed25519_signature_functions },
 | ||||
| -    { PROV_NAMES_ED448, FIPS_DEFAULT_PROPERTIES, ossl_ed448_signature_functions },
 | ||||
| +    { PROV_NAMES_ED25519, FIPS_UNAPPROVED_PROPERTIES, ossl_ed25519_signature_functions },
 | ||||
| +    { PROV_NAMES_ED448, FIPS_UNAPPROVED_PROPERTIES, ossl_ed448_signature_functions },
 | ||||
|      { PROV_NAMES_ECDSA, FIPS_DEFAULT_PROPERTIES, ossl_ecdsa_signature_functions }, | ||||
|  #endif | ||||
|      { PROV_NAMES_HMAC, FIPS_DEFAULT_PROPERTIES, | ||||
| @@ -421,7 +424,7 @@ static const OSSL_ALGORITHM fips_keymgmt
 | ||||
|        PROV_DESCS_DHX }, | ||||
|  #endif | ||||
|  #ifndef OPENSSL_NO_DSA | ||||
| -    { PROV_NAMES_DSA, FIPS_DEFAULT_PROPERTIES, ossl_dsa_keymgmt_functions,
 | ||||
| +    { PROV_NAMES_DSA, FIPS_UNAPPROVED_PROPERTIES, ossl_dsa_keymgmt_functions,
 | ||||
|        PROV_DESCS_DSA }, | ||||
|  #endif | ||||
|      { PROV_NAMES_RSA, FIPS_DEFAULT_PROPERTIES, ossl_rsa_keymgmt_functions, | ||||
| @@ -431,13 +434,13 @@ static const OSSL_ALGORITHM fips_keymgmt
 | ||||
|  #ifndef OPENSSL_NO_EC | ||||
|      { PROV_NAMES_EC, FIPS_DEFAULT_PROPERTIES, ossl_ec_keymgmt_functions, | ||||
|        PROV_DESCS_EC }, | ||||
| -    { PROV_NAMES_X25519, FIPS_DEFAULT_PROPERTIES, ossl_x25519_keymgmt_functions,
 | ||||
| +    { PROV_NAMES_X25519, FIPS_UNAPPROVED_PROPERTIES, ossl_x25519_keymgmt_functions,
 | ||||
|        PROV_DESCS_X25519 }, | ||||
| -    { PROV_NAMES_X448, FIPS_DEFAULT_PROPERTIES, ossl_x448_keymgmt_functions,
 | ||||
| +    { PROV_NAMES_X448, FIPS_UNAPPROVED_PROPERTIES, ossl_x448_keymgmt_functions,
 | ||||
|        PROV_DESCS_X448 }, | ||||
| -    { PROV_NAMES_ED25519, FIPS_DEFAULT_PROPERTIES, ossl_ed25519_keymgmt_functions,
 | ||||
| +    { PROV_NAMES_ED25519, FIPS_UNAPPROVED_PROPERTIES, ossl_ed25519_keymgmt_functions,
 | ||||
|        PROV_DESCS_ED25519 }, | ||||
| -    { PROV_NAMES_ED448, FIPS_DEFAULT_PROPERTIES, ossl_ed448_keymgmt_functions,
 | ||||
| +    { PROV_NAMES_ED448, FIPS_UNAPPROVED_PROPERTIES, ossl_ed448_keymgmt_functions,
 | ||||
|        PROV_DESCS_ED448 }, | ||||
|  #endif | ||||
|      { PROV_NAMES_TLS1_PRF, FIPS_DEFAULT_PROPERTIES, ossl_kdf_keymgmt_functions, | ||||
| diff -up openssl-3.0.0/test/acvp_test.c.fipsmin openssl-3.0.0/test/acvp_test.c
 | ||||
| --- openssl-3.0.0/test/acvp_test.c.fipsmin	2022-01-12 18:34:17.283654119 +0100
 | ||||
| +++ openssl-3.0.0/test/acvp_test.c	2022-01-12 18:35:46.270430676 +0100
 | ||||
| @@ -1473,6 +1473,7 @@ int setup_tests(void)
 | ||||
|                    OSSL_NELEM(dh_safe_prime_keyver_data)); | ||||
|  #endif /* OPENSSL_NO_DH */ | ||||
|   | ||||
| +#if 0 /* Red Hat FIPS provider doesn't have fips=yes property on DSA */
 | ||||
|  #ifndef OPENSSL_NO_DSA | ||||
|      ADD_ALL_TESTS(dsa_keygen_test, OSSL_NELEM(dsa_keygen_data)); | ||||
|      ADD_ALL_TESTS(dsa_paramgen_test, OSSL_NELEM(dsa_paramgen_data)); | ||||
| @@ -1480,6 +1481,7 @@ int setup_tests(void)
 | ||||
|      ADD_ALL_TESTS(dsa_siggen_test, OSSL_NELEM(dsa_siggen_data)); | ||||
|      ADD_ALL_TESTS(dsa_sigver_test, OSSL_NELEM(dsa_sigver_data)); | ||||
|  #endif /* OPENSSL_NO_DSA */ | ||||
| +#endif
 | ||||
|   | ||||
|  #ifndef OPENSSL_NO_EC | ||||
|      ADD_ALL_TESTS(ecdsa_keygen_test, OSSL_NELEM(ecdsa_keygen_data)); | ||||
							
								
								
									
										22
									
								
								SOURCES/0046-FIPS-s390x-hardening.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								SOURCES/0046-FIPS-s390x-hardening.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| diff --git a/crypto/ec/ecp_s390x_nistp.c b/crypto/ec/ecp_s390x_nistp.c
 | ||||
| index 5c70b2d67840..c5726c638bdd 100644
 | ||||
| --- a/crypto/ec/ecp_s390x_nistp.c
 | ||||
| +++ b/crypto/ec/ecp_s390x_nistp.c
 | ||||
| @@ -116,7 +116,7 @@ static int ec_GFp_s390x_nistp_mul(const EC_GROUP *group, EC_POINT *r,
 | ||||
|      /* Otherwise use default. */ | ||||
|      if (rc == -1) | ||||
|          rc = ossl_ec_wNAF_mul(group, r, scalar, num, points, scalars, ctx); | ||||
| -    OPENSSL_cleanse(param + S390X_OFF_SCALAR(len), len);
 | ||||
| +    OPENSSL_cleanse(param, sizeof(param));
 | ||||
|      BN_CTX_end(ctx); | ||||
|      BN_CTX_free(new_ctx); | ||||
|      return rc; | ||||
| @@ -212,7 +212,7 @@ static ECDSA_SIG *ecdsa_s390x_nistp_sign_sig(const unsigned char *dgst,
 | ||||
|   | ||||
|      ok = 1; | ||||
|  ret: | ||||
| -    OPENSSL_cleanse(param + S390X_OFF_K(len), 2 * len);
 | ||||
| +    OPENSSL_cleanse(param, sizeof(param));
 | ||||
|      if (ok != 1) { | ||||
|          ECDSA_SIG_free(sig); | ||||
|          sig = NULL; | ||||
							
								
								
									
										39
									
								
								SOURCES/0047-FIPS-early-KATS.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								SOURCES/0047-FIPS-early-KATS.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| diff -up openssl-3.0.1/providers/fips/self_test.c.earlykats openssl-3.0.1/providers/fips/self_test.c
 | ||||
| --- openssl-3.0.1/providers/fips/self_test.c.earlykats	2022-01-19 13:10:00.635830783 +0100
 | ||||
| +++ openssl-3.0.1/providers/fips/self_test.c	2022-01-19 13:11:43.309342656 +0100
 | ||||
| @@ -362,6 +362,16 @@ int SELF_TEST_post(SELF_TEST_POST_PARAMS
 | ||||
|      if (ev == NULL) | ||||
|          goto end; | ||||
|   | ||||
| +    /*
 | ||||
| +     * Run the KAT's before HMAC verification according to FIPS-140-3 requirements
 | ||||
| +     */
 | ||||
| +    if (kats_already_passed == 0) {
 | ||||
| +        if (!SELF_TEST_kats(ev, st->libctx)) {
 | ||||
| +            ERR_raise(ERR_LIB_PROV, PROV_R_SELF_TEST_KAT_FAILURE);
 | ||||
| +            goto end;
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +
 | ||||
|      module_checksum = fips_hmac_container; | ||||
|      checksum_len = sizeof(fips_hmac_container); | ||||
|   | ||||
| @@ -411,18 +421,6 @@ int SELF_TEST_post(SELF_TEST_POST_PARAMS
 | ||||
|              kats_already_passed = 1; | ||||
|          } | ||||
|      } | ||||
| -
 | ||||
| -    /*
 | ||||
| -     * Only runs the KAT's during installation OR on_demand().
 | ||||
| -     * NOTE: If the installation option 'self_test_onload' is chosen then this
 | ||||
| -     * path will always be run, since kats_already_passed will always be 0.
 | ||||
| -     */
 | ||||
| -    if (on_demand_test || kats_already_passed == 0) {
 | ||||
| -        if (!SELF_TEST_kats(ev, st->libctx)) {
 | ||||
| -            ERR_raise(ERR_LIB_PROV, PROV_R_SELF_TEST_KAT_FAILURE);
 | ||||
| -            goto end;
 | ||||
| -        }
 | ||||
| -    }
 | ||||
|      ok = 1; | ||||
|  end: | ||||
|      OSSL_SELF_TEST_free(ev); | ||||
							
								
								
									
										52
									
								
								SOURCES/0048-correctly-handle-records.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								SOURCES/0048-correctly-handle-records.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| diff -up openssl-3.0.1/apps/s_server.c.handle-records openssl-3.0.1/apps/s_server.c
 | ||||
| --- openssl-3.0.1/apps/s_server.c.handle-records	2022-02-03 15:26:16.803434943 +0100
 | ||||
| +++ openssl-3.0.1/apps/s_server.c	2022-02-03 15:34:33.358298697 +0100
 | ||||
| @@ -2982,7 +2982,9 @@ static int www_body(int s, int stype, in
 | ||||
|      /* Set width for a select call if needed */ | ||||
|      width = s + 1; | ||||
|   | ||||
| -    buf = app_malloc(bufsize, "server www buffer");
 | ||||
| +    /* as we use BIO_gets(), and it always null terminates data, we need
 | ||||
| +     * to allocate 1 byte longer buffer to fit the full 2^14 byte record */
 | ||||
| +    buf = app_malloc(bufsize + 1, "server www buffer");
 | ||||
|      io = BIO_new(BIO_f_buffer()); | ||||
|      ssl_bio = BIO_new(BIO_f_ssl()); | ||||
|      if ((io == NULL) || (ssl_bio == NULL)) | ||||
| @@ -3047,7 +3049,7 @@ static int www_body(int s, int stype, in
 | ||||
|      } | ||||
|   | ||||
|      for (;;) { | ||||
| -        i = BIO_gets(io, buf, bufsize - 1);
 | ||||
| +        i = BIO_gets(io, buf, bufsize + 1);
 | ||||
|          if (i < 0) {            /* error */ | ||||
|              if (!BIO_should_retry(io) && !SSL_waiting_for_async(con)) { | ||||
|                  if (!s_quiet) | ||||
| @@ -3112,7 +3114,7 @@ static int www_body(int s, int stype, in
 | ||||
|                   * we're expecting to come from the client. If they haven't | ||||
|                   * sent one there's not much we can do. | ||||
|                   */ | ||||
| -                BIO_gets(io, buf, bufsize - 1);
 | ||||
| +                BIO_gets(io, buf, bufsize + 1);
 | ||||
|              } | ||||
|   | ||||
|              BIO_puts(io, | ||||
| @@ -3401,7 +3403,9 @@ static int rev_body(int s, int stype, in
 | ||||
|      SSL *con; | ||||
|      BIO *io, *ssl_bio, *sbio; | ||||
|   | ||||
| -    buf = app_malloc(bufsize, "server rev buffer");
 | ||||
| +    /* as we use BIO_gets(), and it always null terminates data, we need
 | ||||
| +     * to allocate 1 byte longer buffer to fit the full 2^14 byte record */
 | ||||
| +    buf = app_malloc(bufsize + 1, "server rev buffer");
 | ||||
|      io = BIO_new(BIO_f_buffer()); | ||||
|      ssl_bio = BIO_new(BIO_f_ssl()); | ||||
|      if ((io == NULL) || (ssl_bio == NULL)) | ||||
| @@ -3476,7 +3480,7 @@ static int rev_body(int s, int stype, in
 | ||||
|      print_ssl_summary(con); | ||||
|   | ||||
|      for (;;) { | ||||
| -        i = BIO_gets(io, buf, bufsize - 1);
 | ||||
| +        i = BIO_gets(io, buf, bufsize + 1);
 | ||||
|          if (i < 0) {            /* error */ | ||||
|              if (!BIO_should_retry(io)) { | ||||
|                  if (!s_quiet) | ||||
							
								
								
									
										489
									
								
								SOURCES/0049-Selectively-disallow-SHA1-signatures.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										489
									
								
								SOURCES/0049-Selectively-disallow-SHA1-signatures.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,489 @@ | ||||
| From 243201772cc6d583fae9eba81cb2c2c7425bc564 Mon Sep 17 00:00:00 2001 | ||||
| From: Clemens Lang <cllang@redhat.com> | ||||
| Date: Mon, 21 Feb 2022 17:24:44 +0100 | ||||
| Subject: Selectively disallow SHA1 signatures | ||||
| 
 | ||||
| For RHEL 9.0, we want to phase out SHA1. One of the steps to do that is | ||||
| disabling SHA1 signatures. Introduce a new configuration option in the | ||||
| alg_section named 'rh-allow-sha1-signatures'. This option defaults to | ||||
| false. If set to false (or unset), any signature creation or | ||||
| verification operations that involve SHA1 as digest will fail. | ||||
| 
 | ||||
| This also affects TLS, where the signature_algorithms extension of any | ||||
| ClientHello message sent by OpenSSL will no longer include signatures | ||||
| with the SHA1 digest if rh-allow-sha1-signatures is false. For servers | ||||
| that request a client certificate, the same also applies for | ||||
| CertificateRequest messages sent by them. | ||||
| 
 | ||||
| For signatures created using the EVP_PKEY API, this is a best-effort | ||||
| check that will deny signatures in cases where the digest algorithm is | ||||
| known. This means, for example, that that following steps will still | ||||
| work: | ||||
| 
 | ||||
|  $> openssl dgst -sha1 -binary -out sha1 infile | ||||
|  $> openssl pkeyutl -inkey key.pem -sign -in sha1 -out sha1sig | ||||
|  $> openssl pkeyutl -inkey key.pem -verify -sigfile sha1sig -in sha1 | ||||
| 
 | ||||
| whereas these will not: | ||||
| 
 | ||||
|  $> openssl dgst -sha1 -binary -out sha1 infile | ||||
|  $> openssl pkeyutl -inkey kem.pem -sign -in sha1 -out sha1sig -pkeyopt digest:sha1 | ||||
|  $> openssl pkeyutl -inkey kem.pem -verify -sigfile sha1sig -in sha1 -pkeyopt digest:sha1 | ||||
| 
 | ||||
| This happens because in the first case, OpenSSL's signature | ||||
| implementation does not know that it is signing a SHA1 hash (it could be | ||||
| signing arbitrary data). | ||||
| 
 | ||||
| Resolves: rhbz#2031742 | ||||
| ---
 | ||||
|  crypto/evp/evp_cnf.c                          | 13 ++++ | ||||
|  crypto/evp/m_sigver.c                         | 77 +++++++++++++++++++ | ||||
|  crypto/evp/pmeth_lib.c                        | 15 ++++ | ||||
|  doc/man5/config.pod                           | 11 +++ | ||||
|  include/internal/cryptlib.h                   |  3 +- | ||||
|  include/internal/sslconf.h                    |  4 + | ||||
|  providers/common/securitycheck.c              | 20 +++++ | ||||
|  providers/common/securitycheck_default.c      |  9 ++- | ||||
|  providers/implementations/signature/dsa_sig.c | 11 ++- | ||||
|  .../implementations/signature/ecdsa_sig.c     |  4 + | ||||
|  providers/implementations/signature/rsa_sig.c | 20 ++++- | ||||
|  ssl/t1_lib.c                                  |  8 ++ | ||||
|  util/libcrypto.num                            |  2 + | ||||
|  13 files changed, 188 insertions(+), 9 deletions(-) | ||||
| 
 | ||||
| diff --git a/crypto/evp/evp_cnf.c b/crypto/evp/evp_cnf.c
 | ||||
| index 0e7fe64cf9..b9d3b6d226 100644
 | ||||
| --- a/crypto/evp/evp_cnf.c
 | ||||
| +++ b/crypto/evp/evp_cnf.c
 | ||||
| @@ -10,6 +10,7 @@
 | ||||
|  #include <stdio.h> | ||||
|  #include <openssl/crypto.h> | ||||
|  #include "internal/cryptlib.h" | ||||
| +#include "internal/sslconf.h"
 | ||||
|  #include <openssl/conf.h> | ||||
|  #include <openssl/x509.h> | ||||
|  #include <openssl/x509v3.h> | ||||
| @@ -57,6 +58,18 @@ static int alg_module_init(CONF_IMODULE *md, const CONF *cnf)
 | ||||
|                  ERR_raise(ERR_LIB_EVP, EVP_R_SET_DEFAULT_PROPERTY_FAILURE); | ||||
|                  return 0; | ||||
|              } | ||||
| +        } else if (strcmp(oval->name, "rh-allow-sha1-signatures") == 0) {
 | ||||
| +            int m;
 | ||||
| +
 | ||||
| +            /* Detailed error already reported. */
 | ||||
| +            if (!X509V3_get_value_bool(oval, &m))
 | ||||
| +                return 0;
 | ||||
| +
 | ||||
| +            if (!ossl_ctx_legacy_digest_signatures_allowed_set(
 | ||||
| +                    NCONF_get0_libctx((CONF *)cnf), m > 0, 0)) {
 | ||||
| +                ERR_raise(ERR_LIB_EVP, EVP_R_SET_DEFAULT_PROPERTY_FAILURE);
 | ||||
| +                return 0;
 | ||||
| +            }
 | ||||
|          } else { | ||||
|              ERR_raise_data(ERR_LIB_EVP, EVP_R_UNKNOWN_OPTION, | ||||
|                             "name=%s, value=%s", oval->name, oval->value); | ||||
| diff --git a/crypto/evp/m_sigver.c b/crypto/evp/m_sigver.c
 | ||||
| index 9188edbc21..db1a1d7bc3 100644
 | ||||
| --- a/crypto/evp/m_sigver.c
 | ||||
| +++ b/crypto/evp/m_sigver.c
 | ||||
| @@ -16,6 +16,71 @@
 | ||||
|  #include "internal/numbers.h"   /* includes SIZE_MAX */ | ||||
|  #include "evp_local.h" | ||||
|   | ||||
| +typedef struct ossl_legacy_digest_signatures_st {
 | ||||
| +    int allowed;
 | ||||
| +} OSSL_LEGACY_DIGEST_SIGNATURES;
 | ||||
| +
 | ||||
| +static void ossl_ctx_legacy_digest_signatures_free(void *vldsigs)
 | ||||
| +{
 | ||||
| +    OSSL_LEGACY_DIGEST_SIGNATURES *ldsigs = vldsigs;
 | ||||
| +
 | ||||
| +    if (ldsigs != NULL) {
 | ||||
| +        OPENSSL_free(ldsigs);
 | ||||
| +    }
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void *ossl_ctx_legacy_digest_signatures_new(OSSL_LIB_CTX *ctx)
 | ||||
| +{
 | ||||
| +    return OPENSSL_zalloc(sizeof(OSSL_LEGACY_DIGEST_SIGNATURES));
 | ||||
| +}
 | ||||
| +
 | ||||
| +static const OSSL_LIB_CTX_METHOD ossl_ctx_legacy_digest_signatures_method = {
 | ||||
| +    OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY,
 | ||||
| +    ossl_ctx_legacy_digest_signatures_new,
 | ||||
| +    ossl_ctx_legacy_digest_signatures_free,
 | ||||
| +};
 | ||||
| +
 | ||||
| +static OSSL_LEGACY_DIGEST_SIGNATURES *ossl_ctx_legacy_digest_signatures(
 | ||||
| +        OSSL_LIB_CTX *libctx, int loadconfig)
 | ||||
| +{
 | ||||
| +#ifndef FIPS_MODULE
 | ||||
| +    if (loadconfig && !OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL))
 | ||||
| +        return 0;
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +    return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_LEGACY_DIGEST_SIGNATURES,
 | ||||
| +                                 &ossl_ctx_legacy_digest_signatures_method);
 | ||||
| +}
 | ||||
| +
 | ||||
| +int ossl_ctx_legacy_digest_signatures_allowed(OSSL_LIB_CTX *libctx, int loadconfig)
 | ||||
| +{
 | ||||
| +    OSSL_LEGACY_DIGEST_SIGNATURES *ldsigs
 | ||||
| +        = ossl_ctx_legacy_digest_signatures(libctx, loadconfig);
 | ||||
| +
 | ||||
| +#ifndef FIPS_MODULE
 | ||||
| +    if (ossl_safe_getenv("OPENSSL_ENABLE_SHA1_SIGNATURES") != NULL)
 | ||||
| +        /* used in tests */
 | ||||
| +        return 1;
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +    return ldsigs != NULL ? ldsigs->allowed : 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +int ossl_ctx_legacy_digest_signatures_allowed_set(OSSL_LIB_CTX *libctx, int allow,
 | ||||
| +                                                  int loadconfig)
 | ||||
| +{
 | ||||
| +    OSSL_LEGACY_DIGEST_SIGNATURES *ldsigs
 | ||||
| +        = ossl_ctx_legacy_digest_signatures(libctx, loadconfig);
 | ||||
| +
 | ||||
| +    if (ldsigs == NULL) {
 | ||||
| +        ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR);
 | ||||
| +        return 0;
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    ldsigs->allowed = allow;
 | ||||
| +    return 1;
 | ||||
| +}
 | ||||
| +
 | ||||
|  #ifndef FIPS_MODULE | ||||
|   | ||||
|  static int update(EVP_MD_CTX *ctx, const void *data, size_t datalen) | ||||
| @@ -258,6 +323,18 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
| +    if (ctx->reqdigest != NULL
 | ||||
| +            && !EVP_PKEY_is_a(locpctx->pkey, SN_hmac)
 | ||||
| +            && !EVP_PKEY_is_a(locpctx->pkey, SN_tls1_prf)
 | ||||
| +            && !EVP_PKEY_is_a(locpctx->pkey, SN_hkdf)) {
 | ||||
| +        int mdnid = EVP_MD_nid(ctx->reqdigest);
 | ||||
| +        if (!ossl_ctx_legacy_digest_signatures_allowed(locpctx->libctx, 0)
 | ||||
| +                && (mdnid == NID_sha1 || mdnid == NID_md5_sha1)) {
 | ||||
| +            ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_DIGEST);
 | ||||
| +            goto err;
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +
 | ||||
|      if (ver) { | ||||
|          if (signature->digest_verify_init == NULL) { | ||||
|              ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); | ||||
| diff --git a/crypto/evp/pmeth_lib.c b/crypto/evp/pmeth_lib.c
 | ||||
| index 2b9c6c2351..3c5a1e6f5d 100644
 | ||||
| --- a/crypto/evp/pmeth_lib.c
 | ||||
| +++ b/crypto/evp/pmeth_lib.c
 | ||||
| @@ -33,6 +33,7 @@
 | ||||
|  #include "internal/ffc.h" | ||||
|  #include "internal/numbers.h" | ||||
|  #include "internal/provider.h" | ||||
| +#include "internal/sslconf.h"
 | ||||
|  #include "evp_local.h" | ||||
|   | ||||
|  #ifndef FIPS_MODULE | ||||
| @@ -946,6 +947,20 @@ static int evp_pkey_ctx_set_md(EVP_PKEY_CTX *ctx, const EVP_MD *md,
 | ||||
|          return -2; | ||||
|      } | ||||
|   | ||||
| +    if (EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx)
 | ||||
| +            && md != NULL
 | ||||
| +            && ctx->pkey != NULL
 | ||||
| +            && !EVP_PKEY_is_a(ctx->pkey, SN_hmac)
 | ||||
| +            && !EVP_PKEY_is_a(ctx->pkey, SN_tls1_prf)
 | ||||
| +            && !EVP_PKEY_is_a(ctx->pkey, SN_hkdf)) {
 | ||||
| +        int mdnid = EVP_MD_nid(md);
 | ||||
| +        if ((mdnid == NID_sha1 || mdnid == NID_md5_sha1)
 | ||||
| +                && !ossl_ctx_legacy_digest_signatures_allowed(ctx->libctx, 0)) {
 | ||||
| +            ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_DIGEST);
 | ||||
| +            return -1;
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +
 | ||||
|      if (fallback) | ||||
|          return EVP_PKEY_CTX_ctrl(ctx, -1, op, ctrl, 0, (void *)(md)); | ||||
|   | ||||
| diff --git a/doc/man5/config.pod b/doc/man5/config.pod
 | ||||
| index 77a8055e81..aa1be5ca7f 100644
 | ||||
| --- a/doc/man5/config.pod
 | ||||
| +++ b/doc/man5/config.pod
 | ||||
| @@ -304,6 +304,17 @@ Within the algorithm properties section, the following names have meaning:
 | ||||
|  The value may be anything that is acceptable as a property query | ||||
|  string for EVP_set_default_properties(). | ||||
|   | ||||
| +=item B<rh-allow-sha1-signatures>
 | ||||
| +
 | ||||
| +The value is a boolean that can be B<yes> or B<no>.  If the value is not set,
 | ||||
| +it behaves as if it was set to B<no>.
 | ||||
| +
 | ||||
| +When set to B<no>, any attempt to create or verify a signature with a SHA1
 | ||||
| +digest will fail.  For compatibility with older versions of OpenSSL, set this
 | ||||
| +option to B<yes>.  This setting also affects TLS, where signature algorithms
 | ||||
| +that use SHA1 as digest will no longer be supported if this option is set to
 | ||||
| +B<no>.
 | ||||
| +
 | ||||
|  =item B<fips_mode> (deprecated) | ||||
|   | ||||
|  The value is a boolean that can be B<yes> or B<no>.  If the value is | ||||
| diff --git a/include/internal/cryptlib.h b/include/internal/cryptlib.h
 | ||||
| index 1291299b6e..e234341e6a 100644
 | ||||
| --- a/include/internal/cryptlib.h
 | ||||
| +++ b/include/internal/cryptlib.h
 | ||||
| @@ -168,7 +168,8 @@ typedef struct ossl_ex_data_global_st {
 | ||||
|  # define OSSL_LIB_CTX_PROVIDER_CONF_INDEX           16 | ||||
|  # define OSSL_LIB_CTX_BIO_CORE_INDEX                17 | ||||
|  # define OSSL_LIB_CTX_CHILD_PROVIDER_INDEX          18 | ||||
| -# define OSSL_LIB_CTX_MAX_INDEXES                   19
 | ||||
| +# define OSSL_LIB_CTX_LEGACY_DIGEST_SIGNATURES      19
 | ||||
| +# define OSSL_LIB_CTX_MAX_INDEXES                   20
 | ||||
|   | ||||
|  # define OSSL_LIB_CTX_METHOD_LOW_PRIORITY          -1 | ||||
|  # define OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY       0 | ||||
| diff --git a/include/internal/sslconf.h b/include/internal/sslconf.h
 | ||||
| index fd7f7e3331..05464b0655 100644
 | ||||
| --- a/include/internal/sslconf.h
 | ||||
| +++ b/include/internal/sslconf.h
 | ||||
| @@ -18,4 +18,8 @@ int conf_ssl_name_find(const char *name, size_t *idx);
 | ||||
|  void conf_ssl_get_cmd(const SSL_CONF_CMD *cmd, size_t idx, char **cmdstr, | ||||
|                        char **arg); | ||||
|   | ||||
| +/* Methods to support disabling all signatures with legacy digests */
 | ||||
| +int ossl_ctx_legacy_digest_signatures_allowed(OSSL_LIB_CTX *libctx, int loadconfig);
 | ||||
| +int ossl_ctx_legacy_digest_signatures_allowed_set(OSSL_LIB_CTX *libctx, int allow,
 | ||||
| +                                                  int loadconfig);
 | ||||
|  #endif | ||||
| diff --git a/providers/common/securitycheck.c b/providers/common/securitycheck.c
 | ||||
| index 699ada7c52..e534ad0a5f 100644
 | ||||
| --- a/providers/common/securitycheck.c
 | ||||
| +++ b/providers/common/securitycheck.c
 | ||||
| @@ -19,6 +19,7 @@
 | ||||
|  #include <openssl/core_names.h> | ||||
|  #include <openssl/obj_mac.h> | ||||
|  #include "prov/securitycheck.h" | ||||
| +#include "internal/sslconf.h"
 | ||||
|   | ||||
|  /* | ||||
|   * FIPS requires a minimum security strength of 112 bits (for encryption or | ||||
| @@ -235,6 +236,15 @@ int ossl_digest_get_approved_nid_with_sha1(OSSL_LIB_CTX *ctx, const EVP_MD *md,
 | ||||
|              mdnid = -1; /* disallowed by security checks */ | ||||
|      } | ||||
|  # endif /* OPENSSL_NO_FIPS_SECURITYCHECKS */ | ||||
| +
 | ||||
| +#ifndef FIPS_MODULE
 | ||||
| +    if (!ossl_ctx_legacy_digest_signatures_allowed(ctx, 0))
 | ||||
| +        /* SHA1 is globally disabled, check whether we want to locally allow
 | ||||
| +         * it. */
 | ||||
| +        if (mdnid == NID_sha1 && !sha1_allowed)
 | ||||
| +            mdnid = -1;
 | ||||
| +#endif
 | ||||
| +
 | ||||
|      return mdnid; | ||||
|  } | ||||
|   | ||||
| @@ -244,5 +254,15 @@ int ossl_digest_is_allowed(OSSL_LIB_CTX *ctx, const EVP_MD *md)
 | ||||
|      if (ossl_securitycheck_enabled(ctx)) | ||||
|          return ossl_digest_get_approved_nid(md) != NID_undef; | ||||
|  # endif /* OPENSSL_NO_FIPS_SECURITYCHECKS */ | ||||
| +
 | ||||
| +#ifndef FIPS_MODULE
 | ||||
| +    {
 | ||||
| +        int mdnid = EVP_MD_nid(md);
 | ||||
| +        if ((mdnid == NID_sha1 || mdnid == NID_md5_sha1)
 | ||||
| +                && !ossl_ctx_legacy_digest_signatures_allowed(ctx, 0))
 | ||||
| +            return 0;
 | ||||
| +    }
 | ||||
| +#endif
 | ||||
| +
 | ||||
|      return 1; | ||||
|  } | ||||
| diff --git a/providers/common/securitycheck_default.c b/providers/common/securitycheck_default.c
 | ||||
| index de7f0d3a0a..ce54a94fbc 100644
 | ||||
| --- a/providers/common/securitycheck_default.c
 | ||||
| +++ b/providers/common/securitycheck_default.c
 | ||||
| @@ -15,6 +15,7 @@
 | ||||
|  #include <openssl/obj_mac.h> | ||||
|  #include "prov/securitycheck.h" | ||||
|  #include "internal/nelem.h" | ||||
| +#include "internal/sslconf.h"
 | ||||
|   | ||||
|  /* Disable the security checks in the default provider */ | ||||
|  int ossl_securitycheck_enabled(OSSL_LIB_CTX *libctx) | ||||
| @@ -23,9 +24,10 @@ int ossl_securitycheck_enabled(OSSL_LIB_CTX *libctx)
 | ||||
|  } | ||||
|   | ||||
|  int ossl_digest_rsa_sign_get_md_nid(OSSL_LIB_CTX *ctx, const EVP_MD *md, | ||||
| -                                    ossl_unused int sha1_allowed)
 | ||||
| +                                    int sha1_allowed)
 | ||||
|  { | ||||
|      int mdnid; | ||||
| +    int ldsigs_allowed;
 | ||||
|   | ||||
|      static const OSSL_ITEM name_to_nid[] = { | ||||
|          { NID_md5,       OSSL_DIGEST_NAME_MD5       }, | ||||
| @@ -36,8 +38,11 @@ int ossl_digest_rsa_sign_get_md_nid(OSSL_LIB_CTX *ctx, const EVP_MD *md,
 | ||||
|          { NID_ripemd160, OSSL_DIGEST_NAME_RIPEMD160 }, | ||||
|      }; | ||||
|   | ||||
| -    mdnid = ossl_digest_get_approved_nid_with_sha1(ctx, md, 1);
 | ||||
| +    ldsigs_allowed = ossl_ctx_legacy_digest_signatures_allowed(ctx, 0);
 | ||||
| +    mdnid = ossl_digest_get_approved_nid_with_sha1(ctx, md, sha1_allowed || ldsigs_allowed);
 | ||||
|      if (mdnid == NID_undef) | ||||
|          mdnid = ossl_digest_md_to_nid(md, name_to_nid, OSSL_NELEM(name_to_nid)); | ||||
| +    if (mdnid == NID_md5_sha1 && !ldsigs_allowed)
 | ||||
| +        mdnid = -1;
 | ||||
|      return mdnid; | ||||
|  } | ||||
| diff --git a/providers/implementations/signature/dsa_sig.c b/providers/implementations/signature/dsa_sig.c
 | ||||
| index 28fd7c498e..fa3822f39f 100644
 | ||||
| --- a/providers/implementations/signature/dsa_sig.c
 | ||||
| +++ b/providers/implementations/signature/dsa_sig.c
 | ||||
| @@ -124,12 +124,17 @@ static int dsa_setup_md(PROV_DSA_CTX *ctx,
 | ||||
|          mdprops = ctx->propq; | ||||
|   | ||||
|      if (mdname != NULL) { | ||||
| -        int sha1_allowed = (ctx->operation != EVP_PKEY_OP_SIGN);
 | ||||
|          WPACKET pkt; | ||||
|          EVP_MD *md = EVP_MD_fetch(ctx->libctx, mdname, mdprops); | ||||
| -        int md_nid = ossl_digest_get_approved_nid_with_sha1(ctx->libctx, md,
 | ||||
| -                                                            sha1_allowed);
 | ||||
| +        int md_nid;
 | ||||
|          size_t mdname_len = strlen(mdname); | ||||
| +#ifdef FIPS_MODULE
 | ||||
| +        int sha1_allowed = (ctx->operation != EVP_PKEY_OP_SIGN);
 | ||||
| +#else
 | ||||
| +        int sha1_allowed = 0;
 | ||||
| +#endif
 | ||||
| +        md_nid = ossl_digest_get_approved_nid_with_sha1(ctx->libctx, md,
 | ||||
| +                                                            sha1_allowed);
 | ||||
|   | ||||
|          if (md == NULL || md_nid < 0) { | ||||
|              if (md == NULL) | ||||
| diff --git a/providers/implementations/signature/ecdsa_sig.c b/providers/implementations/signature/ecdsa_sig.c
 | ||||
| index 865d49d100..99b228e82c 100644
 | ||||
| --- a/providers/implementations/signature/ecdsa_sig.c
 | ||||
| +++ b/providers/implementations/signature/ecdsa_sig.c
 | ||||
| @@ -237,7 +237,11 @@ static int ecdsa_setup_md(PROV_ECDSA_CTX *ctx, const char *mdname,
 | ||||
|                         "%s could not be fetched", mdname); | ||||
|          return 0; | ||||
|      } | ||||
| +#ifdef FIPS_MODULE
 | ||||
|      sha1_allowed = (ctx->operation != EVP_PKEY_OP_SIGN); | ||||
| +#else
 | ||||
| +    sha1_allowed = 0;
 | ||||
| +#endif
 | ||||
|      md_nid = ossl_digest_get_approved_nid_with_sha1(ctx->libctx, md, | ||||
|                                                      sha1_allowed); | ||||
|      if (md_nid < 0) { | ||||
| diff --git a/providers/implementations/signature/rsa_sig.c b/providers/implementations/signature/rsa_sig.c
 | ||||
| index 325e855333..bea397f0c1 100644
 | ||||
| --- a/providers/implementations/signature/rsa_sig.c
 | ||||
| +++ b/providers/implementations/signature/rsa_sig.c
 | ||||
| @@ -26,6 +26,7 @@
 | ||||
|  #include "internal/cryptlib.h" | ||||
|  #include "internal/nelem.h" | ||||
|  #include "internal/sizes.h" | ||||
| +#include "internal/sslconf.h"
 | ||||
|  #include "crypto/rsa.h" | ||||
|  #include "prov/providercommon.h" | ||||
|  #include "prov/implementations.h" | ||||
| @@ -34,6 +35,7 @@
 | ||||
|  #include "prov/securitycheck.h" | ||||
|   | ||||
|  #define RSA_DEFAULT_DIGEST_NAME OSSL_DIGEST_NAME_SHA1 | ||||
| +#define RSA_DEFAULT_DIGEST_NAME_NONLEGACY OSSL_DIGEST_NAME_SHA2_256
 | ||||
|   | ||||
|  static OSSL_FUNC_signature_newctx_fn rsa_newctx; | ||||
|  static OSSL_FUNC_signature_sign_init_fn rsa_sign_init; | ||||
| @@ -289,10 +291,15 @@ static int rsa_setup_md(PROV_RSA_CTX *ctx, const char *mdname,
 | ||||
|   | ||||
|      if (mdname != NULL) { | ||||
|          EVP_MD *md = EVP_MD_fetch(ctx->libctx, mdname, mdprops); | ||||
| +        int md_nid;
 | ||||
| +        size_t mdname_len = strlen(mdname);
 | ||||
| +#ifdef FIPS_MODULE
 | ||||
|          int sha1_allowed = (ctx->operation != EVP_PKEY_OP_SIGN); | ||||
| -        int md_nid = ossl_digest_rsa_sign_get_md_nid(ctx->libctx, md,
 | ||||
| +#else
 | ||||
| +        int sha1_allowed = 0;
 | ||||
| +#endif
 | ||||
| +        md_nid = ossl_digest_rsa_sign_get_md_nid(ctx->libctx, md,
 | ||||
|                                                       sha1_allowed); | ||||
| -        size_t mdname_len = strlen(mdname);
 | ||||
|   | ||||
|          if (md == NULL | ||||
|              || md_nid <= 0 | ||||
| @@ -1348,8 +1355,15 @@ static int rsa_set_ctx_params(void *vprsactx, const OSSL_PARAM params[])
 | ||||
|      prsactx->pad_mode = pad_mode; | ||||
|   | ||||
|      if (prsactx->md == NULL && pmdname == NULL | ||||
| -        && pad_mode == RSA_PKCS1_PSS_PADDING)
 | ||||
| +        && pad_mode == RSA_PKCS1_PSS_PADDING) {
 | ||||
|          pmdname = RSA_DEFAULT_DIGEST_NAME; | ||||
| +#ifndef FIPS_MODULE
 | ||||
| +        if (!ossl_ctx_legacy_digest_signatures_allowed(prsactx->libctx, 0)) {
 | ||||
| +            pmdname = RSA_DEFAULT_DIGEST_NAME_NONLEGACY;
 | ||||
| +        }
 | ||||
| +#endif
 | ||||
| +    }
 | ||||
| +
 | ||||
|   | ||||
|      if (pmgf1mdname != NULL | ||||
|          && !rsa_setup_mgf1_md(prsactx, pmgf1mdname, pmgf1mdprops)) | ||||
| diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
 | ||||
| index fc32bb3556..4b74ee1a34 100644
 | ||||
| --- a/ssl/t1_lib.c
 | ||||
| +++ b/ssl/t1_lib.c
 | ||||
| @@ -20,6 +20,7 @@
 | ||||
|  #include <openssl/bn.h> | ||||
|  #include <openssl/provider.h> | ||||
|  #include <openssl/param_build.h> | ||||
| +#include "internal/sslconf.h"
 | ||||
|  #include "internal/nelem.h" | ||||
|  #include "internal/sizes.h" | ||||
|  #include "internal/tlsgroups.h" | ||||
| @@ -1145,11 +1146,13 @@ int ssl_setup_sig_algs(SSL_CTX *ctx)
 | ||||
|          = OPENSSL_malloc(sizeof(*lu) * OSSL_NELEM(sigalg_lookup_tbl)); | ||||
|      EVP_PKEY *tmpkey = EVP_PKEY_new(); | ||||
|      int ret = 0; | ||||
| +    int ldsigs_allowed;
 | ||||
|   | ||||
|      if (cache == NULL || tmpkey == NULL) | ||||
|          goto err; | ||||
|   | ||||
|      ERR_set_mark(); | ||||
| +    ldsigs_allowed = ossl_ctx_legacy_digest_signatures_allowed(ctx->libctx, 0);
 | ||||
|      for (i = 0, lu = sigalg_lookup_tbl; | ||||
|           i < OSSL_NELEM(sigalg_lookup_tbl); lu++, i++) { | ||||
|          EVP_PKEY_CTX *pctx; | ||||
| @@ -1169,6 +1172,11 @@ int ssl_setup_sig_algs(SSL_CTX *ctx)
 | ||||
|              cache[i].enabled = 0; | ||||
|              continue; | ||||
|          } | ||||
| +        if ((lu->hash == NID_sha1 || lu->hash == NID_md5_sha1)
 | ||||
| +                && !ldsigs_allowed) {
 | ||||
| +            cache[i].enabled = 0;
 | ||||
| +            continue;
 | ||||
| +        }
 | ||||
|   | ||||
|          if (!EVP_PKEY_set_type(tmpkey, lu->sig)) { | ||||
|              cache[i].enabled = 0; | ||||
| diff --git a/util/libcrypto.num b/util/libcrypto.num
 | ||||
| index 10b4e57d79..2d3c363bb0 100644
 | ||||
| --- a/util/libcrypto.num
 | ||||
| +++ b/util/libcrypto.num
 | ||||
| @@ -5426,3 +5426,5 @@ ASN1_TIME_print_ex                      5553	3_0_0	EXIST::FUNCTION:
 | ||||
|  EVP_PKEY_get0_provider                  5554	3_0_0	EXIST::FUNCTION: | ||||
|  EVP_PKEY_CTX_get0_provider              5555	3_0_0	EXIST::FUNCTION: | ||||
|  ossl_safe_getenv                        ?	3_0_0	EXIST::FUNCTION: | ||||
| +ossl_ctx_legacy_digest_signatures_allowed ?	3_0_1	EXIST::FUNCTION:
 | ||||
| +ossl_ctx_legacy_digest_signatures_allowed_set ?	3_0_1	EXIST::FUNCTION:
 | ||||
| -- 
 | ||||
| 2.35.1 | ||||
| 
 | ||||
							
								
								
									
										95
									
								
								SOURCES/0050-FIPS-enable-pkcs12-mac.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								SOURCES/0050-FIPS-enable-pkcs12-mac.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,95 @@ | ||||
| diff -up openssl-3.0.1/crypto/pkcs12/p12_key.c.pkc12_fips openssl-3.0.1/crypto/pkcs12/p12_key.c
 | ||||
| --- openssl-3.0.1/crypto/pkcs12/p12_key.c.pkc12_fips	2022-02-21 12:35:24.829893907 +0100
 | ||||
| +++ openssl-3.0.1/crypto/pkcs12/p12_key.c	2022-02-21 13:01:22.711622967 +0100
 | ||||
| @@ -85,17 +85,41 @@ int PKCS12_key_gen_uni_ex(unsigned char
 | ||||
|      EVP_KDF *kdf; | ||||
|      EVP_KDF_CTX *ctx; | ||||
|      OSSL_PARAM params[6], *p = params; | ||||
| +    char *adjusted_propq = NULL;
 | ||||
|   | ||||
|      if (n <= 0) | ||||
|          return 0; | ||||
|   | ||||
| -    kdf = EVP_KDF_fetch(libctx, "PKCS12KDF", propq);
 | ||||
| -    if (kdf == NULL)
 | ||||
| +    if (ossl_get_kernel_fips_flag()) {
 | ||||
| +        const char *nofips = "-fips";
 | ||||
| +        size_t len = propq ? strlen(propq) + 1 + strlen(nofips) + 1 :
 | ||||
| +                                                 strlen(nofips) + 1;
 | ||||
| +        char *ptr = NULL;
 | ||||
| +
 | ||||
| +        adjusted_propq = OPENSSL_zalloc(len);
 | ||||
| +        if (adjusted_propq != NULL) {
 | ||||
| +            ptr = adjusted_propq;
 | ||||
| +            if (propq) {
 | ||||
| +                memcpy(ptr, propq, strlen(propq));
 | ||||
| +                ptr += strlen(propq);
 | ||||
| +                *ptr = ',';
 | ||||
| +                ptr++;
 | ||||
| +            }
 | ||||
| +            memcpy(ptr, nofips, strlen(nofips));
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    kdf = adjusted_propq ? EVP_KDF_fetch(libctx, "PKCS12KDF", adjusted_propq) : EVP_KDF_fetch(libctx, "PKCS12KDF", propq);
 | ||||
| +    if (kdf == NULL) {
 | ||||
| +        OPENSSL_free(adjusted_propq);
 | ||||
|          return 0; | ||||
| +    }
 | ||||
|      ctx = EVP_KDF_CTX_new(kdf); | ||||
|      EVP_KDF_free(kdf); | ||||
| -    if (ctx == NULL)
 | ||||
| +    if (ctx == NULL) {
 | ||||
| +        OPENSSL_free(adjusted_propq);
 | ||||
|          return 0; | ||||
| +    }
 | ||||
|   | ||||
|      *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, | ||||
|                                              (char *)EVP_MD_get0_name(md_type), | ||||
| @@ -127,6 +149,7 @@ int PKCS12_key_gen_uni_ex(unsigned char
 | ||||
|          } OSSL_TRACE_END(PKCS12_KEYGEN); | ||||
|      } | ||||
|      EVP_KDF_CTX_free(ctx); | ||||
| +    OPENSSL_free(adjusted_propq);
 | ||||
|      return res; | ||||
|  } | ||||
|   | ||||
| diff -up openssl-3.0.1/apps/pkcs12.c.pkc12_fips_apps openssl-3.0.1/apps/pkcs12.c
 | ||||
| --- openssl-3.0.1/apps/pkcs12.c.pkc12_fips_apps	2022-02-21 16:37:07.908923682 +0100
 | ||||
| +++ openssl-3.0.1/apps/pkcs12.c	2022-02-21 17:38:44.555345633 +0100
 | ||||
| @@ -765,15 +765,34 @@ int pkcs12_main(int argc, char **argv)
 | ||||
|      } | ||||
|      if (macver) { | ||||
|          EVP_KDF *pkcs12kdf; | ||||
| +        char *adjusted_propq = NULL;
 | ||||
| +        const char *nofips = "-fips";
 | ||||
| +        size_t len = app_get0_propq() ? strlen(app_get0_propq()) + 1 + strlen(nofips) + 1 :
 | ||||
| +                                                            strlen(nofips) + 1;
 | ||||
| +        char *ptr = NULL;
 | ||||
| +
 | ||||
| +        adjusted_propq = OPENSSL_zalloc(len);
 | ||||
| +        if (adjusted_propq != NULL) {
 | ||||
| +                ptr = adjusted_propq;
 | ||||
| +                if (app_get0_propq()) {
 | ||||
| +                    memcpy(ptr, app_get0_propq(), strlen(app_get0_propq()));
 | ||||
| +                    ptr += strlen(app_get0_propq());
 | ||||
| +                    *ptr = ',';
 | ||||
| +                    ptr++;
 | ||||
| +                }
 | ||||
| +                memcpy(ptr, nofips, strlen(nofips));
 | ||||
| +        }
 | ||||
|   | ||||
|          pkcs12kdf = EVP_KDF_fetch(app_get0_libctx(), "PKCS12KDF", | ||||
| -                                  app_get0_propq());
 | ||||
| +                                  adjusted_propq ? adjusted_propq : app_get0_propq());
 | ||||
|          if (pkcs12kdf == NULL) { | ||||
|              BIO_printf(bio_err, "Error verifying PKCS12 MAC; no PKCS12KDF support.\n"); | ||||
|              BIO_printf(bio_err, "Use -nomacver if MAC verification is not required.\n"); | ||||
| +            OPENSSL_free(adjusted_propq);
 | ||||
|              goto end; | ||||
|          } | ||||
|          EVP_KDF_free(pkcs12kdf); | ||||
| +        OPENSSL_free(adjusted_propq);
 | ||||
|          /* If we enter empty password try no password first */ | ||||
|          if (!mpass[0] && PKCS12_verify_mac(p12, NULL, 0)) { | ||||
|              /* If mac and crypto pass the same set it to NULL too */ | ||||
							
								
								
									
										2151
									
								
								SOURCES/0051-Support-different-R_BITS-lengths-for-KBKDF.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2151
									
								
								SOURCES/0051-Support-different-R_BITS-lengths-for-KBKDF.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -0,0 +1,206 @@ | ||||
| From c63599ee9708d543205a9173207ee7167315c624 Mon Sep 17 00:00:00 2001 | ||||
| From: Clemens Lang <cllang@redhat.com> | ||||
| Date: Tue, 1 Mar 2022 15:44:18 +0100 | ||||
| Subject: [PATCH] Allow SHA1 in seclevel 2 if rh-allow-sha1-signatures = yes | ||||
| 
 | ||||
| References: rhbz#2055796 | ||||
| ---
 | ||||
|  crypto/x509/x509_vfy.c        | 19 ++++++++++- | ||||
|  doc/man5/config.pod           |  7 +++- | ||||
|  ssl/t1_lib.c                  | 64 ++++++++++++++++++++++++++++------- | ||||
|  test/recipes/25-test_verify.t |  7 ++-- | ||||
|  4 files changed, 79 insertions(+), 18 deletions(-) | ||||
| 
 | ||||
| diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c
 | ||||
| index ff3ca83de6..a549c1c111 100644
 | ||||
| --- a/crypto/x509/x509_vfy.c
 | ||||
| +++ b/crypto/x509/x509_vfy.c
 | ||||
| @@ -25,6 +25,7 @@
 | ||||
|  #include <openssl/objects.h> | ||||
|  #include <openssl/core_names.h> | ||||
|  #include "internal/dane.h" | ||||
| +#include "internal/sslconf.h"
 | ||||
|  #include "crypto/x509.h" | ||||
|  #include "x509_local.h" | ||||
|   | ||||
| @@ -3440,14 +3441,30 @@ static int check_sig_level(X509_STORE_CTX *ctx, X509 *cert)
 | ||||
|  { | ||||
|      int secbits = -1; | ||||
|      int level = ctx->param->auth_level; | ||||
| +    int nid;
 | ||||
| +    OSSL_LIB_CTX *libctx = NULL;
 | ||||
|   | ||||
|      if (level <= 0) | ||||
|          return 1; | ||||
|      if (level > NUM_AUTH_LEVELS) | ||||
|          level = NUM_AUTH_LEVELS; | ||||
|   | ||||
| -    if (!X509_get_signature_info(cert, NULL, NULL, &secbits, NULL))
 | ||||
| +    if (ctx->libctx)
 | ||||
| +        libctx = ctx->libctx;
 | ||||
| +    else if (cert->libctx)
 | ||||
| +        libctx = cert->libctx;
 | ||||
| +    else
 | ||||
| +        libctx = OSSL_LIB_CTX_get0_global_default();
 | ||||
| +
 | ||||
| +    if (!X509_get_signature_info(cert, &nid, NULL, &secbits, NULL))
 | ||||
|          return 0; | ||||
|   | ||||
| +    if (nid == NID_sha1
 | ||||
| +            && ossl_ctx_legacy_digest_signatures_allowed(libctx, 0)
 | ||||
| +            && ctx->param->auth_level < 3)
 | ||||
| +        /* When rh-allow-sha1-signatures = yes and security level <= 2,
 | ||||
| +         * explicitly allow SHA1 for backwards compatibility. */
 | ||||
| +        return 1;
 | ||||
| +
 | ||||
|      return secbits >= minbits_table[level - 1]; | ||||
|  } | ||||
| diff --git a/doc/man5/config.pod b/doc/man5/config.pod
 | ||||
| index aa1be5ca7f..aa69e2b844 100644
 | ||||
| --- a/doc/man5/config.pod
 | ||||
| +++ b/doc/man5/config.pod
 | ||||
| @@ -305,7 +305,12 @@ When set to B<no>, any attempt to create or verify a signature with a SHA1
 | ||||
|  digest will fail.  For compatibility with older versions of OpenSSL, set this | ||||
|  option to B<yes>.  This setting also affects TLS, where signature algorithms | ||||
|  that use SHA1 as digest will no longer be supported if this option is set to | ||||
| -B<no>.
 | ||||
| +B<no>.  Note that enabling B<rh-allow-sha1-signatures> will allow TLS signature
 | ||||
| +algorithms that use SHA1 in security level 2, despite the definition of
 | ||||
| +security level 2 of 112 bits of security, which SHA1 does not meet.  Because
 | ||||
| +TLS 1.1 or lower use MD5-SHA1 as pseudorandom function (PRF) to derive key
 | ||||
| +material, disabling B<rh-allow-sha1-signatures> requires the use of TLS 1.2 or
 | ||||
| +newer.
 | ||||
|   | ||||
|  =item B<fips_mode> (deprecated) | ||||
|   | ||||
| diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
 | ||||
| index 4b74ee1a34..5f089de107 100644
 | ||||
| --- a/ssl/t1_lib.c
 | ||||
| +++ b/ssl/t1_lib.c
 | ||||
| @@ -20,6 +20,7 @@
 | ||||
|  #include <openssl/bn.h> | ||||
|  #include <openssl/provider.h> | ||||
|  #include <openssl/param_build.h> | ||||
| +#include "crypto/x509.h"
 | ||||
|  #include "internal/sslconf.h" | ||||
|  #include "internal/nelem.h" | ||||
|  #include "internal/sizes.h" | ||||
| @@ -1561,19 +1562,27 @@ int tls12_check_peer_sigalg(SSL *s, uint16_t sig, EVP_PKEY *pkey)
 | ||||
|          SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_UNKNOWN_DIGEST); | ||||
|          return 0; | ||||
|      } | ||||
| -    /*
 | ||||
| -     * Make sure security callback allows algorithm. For historical
 | ||||
| -     * reasons we have to pass the sigalg as a two byte char array.
 | ||||
| -     */
 | ||||
| -    sigalgstr[0] = (sig >> 8) & 0xff;
 | ||||
| -    sigalgstr[1] = sig & 0xff;
 | ||||
| -    secbits = sigalg_security_bits(s->ctx, lu);
 | ||||
| -    if (secbits == 0 ||
 | ||||
| -        !ssl_security(s, SSL_SECOP_SIGALG_CHECK, secbits,
 | ||||
| -                      md != NULL ? EVP_MD_get_type(md) : NID_undef,
 | ||||
| -                      (void *)sigalgstr)) {
 | ||||
| -        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_WRONG_SIGNATURE_TYPE);
 | ||||
| -        return 0;
 | ||||
| +
 | ||||
| +    if (lu->hash == NID_sha1
 | ||||
| +            && ossl_ctx_legacy_digest_signatures_allowed(s->ctx->libctx, 0)
 | ||||
| +            && SSL_get_security_level(s) < 3) {
 | ||||
| +        /* when rh-allow-sha1-signatures = yes and security level <= 2,
 | ||||
| +         * explicitly allow SHA1 for backwards compatibility */
 | ||||
| +    } else {
 | ||||
| +        /*
 | ||||
| +         * Make sure security callback allows algorithm. For historical
 | ||||
| +         * reasons we have to pass the sigalg as a two byte char array.
 | ||||
| +         */
 | ||||
| +        sigalgstr[0] = (sig >> 8) & 0xff;
 | ||||
| +        sigalgstr[1] = sig & 0xff;
 | ||||
| +        secbits = sigalg_security_bits(s->ctx, lu);
 | ||||
| +        if (secbits == 0 ||
 | ||||
| +            !ssl_security(s, SSL_SECOP_SIGALG_CHECK, secbits,
 | ||||
| +                          md != NULL ? EVP_MD_get_type(md) : NID_undef,
 | ||||
| +                          (void *)sigalgstr)) {
 | ||||
| +            SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_WRONG_SIGNATURE_TYPE);
 | ||||
| +            return 0;
 | ||||
| +        }
 | ||||
|      } | ||||
|      /* Store the sigalg the peer uses */ | ||||
|      s->s3.tmp.peer_sigalg = lu; | ||||
| @@ -2106,6 +2115,14 @@ static int tls12_sigalg_allowed(const SSL *s, int op, const SIGALG_LOOKUP *lu)
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
| +    if (lu->hash == NID_sha1
 | ||||
| +            && ossl_ctx_legacy_digest_signatures_allowed(s->ctx->libctx, 0)
 | ||||
| +            && SSL_get_security_level(s) < 3) {
 | ||||
| +        /* when rh-allow-sha1-signatures = yes and security level <= 2,
 | ||||
| +         * explicitly allow SHA1 for backwards compatibility */
 | ||||
| +        return 1;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      /* Finally see if security callback allows it */ | ||||
|      secbits = sigalg_security_bits(s->ctx, lu); | ||||
|      sigalgstr[0] = (lu->sigalg >> 8) & 0xff; | ||||
| @@ -2977,6 +2994,8 @@ static int ssl_security_cert_sig(SSL *s, SSL_CTX *ctx, X509 *x, int op)
 | ||||
|  { | ||||
|      /* Lookup signature algorithm digest */ | ||||
|      int secbits, nid, pknid; | ||||
| +    OSSL_LIB_CTX *libctx = NULL;
 | ||||
| +
 | ||||
|      /* Don't check signature if self signed */ | ||||
|      if ((X509_get_extension_flags(x) & EXFLAG_SS) != 0) | ||||
|          return 1; | ||||
| @@ -2985,6 +3004,25 @@ static int ssl_security_cert_sig(SSL *s, SSL_CTX *ctx, X509 *x, int op)
 | ||||
|      /* If digest NID not defined use signature NID */ | ||||
|      if (nid == NID_undef) | ||||
|          nid = pknid; | ||||
| +
 | ||||
| +    if (x && x->libctx)
 | ||||
| +        libctx = x->libctx;
 | ||||
| +    else if (ctx && ctx->libctx)
 | ||||
| +        libctx = ctx->libctx;
 | ||||
| +    else if (s && s->ctx && s->ctx->libctx)
 | ||||
| +        libctx = s->ctx->libctx;
 | ||||
| +    else
 | ||||
| +        libctx = OSSL_LIB_CTX_get0_global_default();
 | ||||
| +
 | ||||
| +    if (nid == NID_sha1
 | ||||
| +            && ossl_ctx_legacy_digest_signatures_allowed(libctx, 0)
 | ||||
| +            && ((s != NULL && SSL_get_security_level(s) < 3)
 | ||||
| +                || (ctx != NULL && SSL_CTX_get_security_level(ctx) < 3)
 | ||||
| +            ))
 | ||||
| +        /* When rh-allow-sha1-signatures = yes and security level <= 2,
 | ||||
| +         * explicitly allow SHA1 for backwards compatibility. */
 | ||||
| +        return 1;
 | ||||
| +
 | ||||
|      if (s) | ||||
|          return ssl_security(s, op, secbits, nid, x); | ||||
|      else | ||||
| diff --git a/test/recipes/25-test_verify.t b/test/recipes/25-test_verify.t
 | ||||
| index 700bbd849c..2de1d76b5e 100644
 | ||||
| --- a/test/recipes/25-test_verify.t
 | ||||
| +++ b/test/recipes/25-test_verify.t
 | ||||
| @@ -29,7 +29,7 @@ sub verify {
 | ||||
|      run(app([@args])); | ||||
|  } | ||||
|   | ||||
| -plan tests => 160;
 | ||||
| +plan tests => 159;
 | ||||
|   | ||||
|  # Canonical success | ||||
|  ok(verify("ee-cert", "sslserver", ["root-cert"], ["ca-cert"]), | ||||
| @@ -387,8 +387,9 @@ ok(verify("ee-pss-sha1-cert", "", ["root-cert"], ["ca-cert"], "-auth_level", "0"
 | ||||
|  ok(verify("ee-pss-sha256-cert", "", ["root-cert"], ["ca-cert"], ), | ||||
|      "CA with PSS signature using SHA256"); | ||||
|   | ||||
| -ok(!verify("ee-pss-sha1-cert", "", ["root-cert"], ["ca-cert"], "-auth_level", "1"),
 | ||||
| -    "Reject PSS signature using SHA1 and auth level 1");
 | ||||
| +## rh-allow-sha1-signatures=yes allows this to pass despite -auth_level 1
 | ||||
| +#ok(!verify("ee-pss-sha1-cert", "", ["root-cert"], ["ca-cert"], "-auth_level", "1"),
 | ||||
| +#    "Reject PSS signature using SHA1 and auth level 1");
 | ||||
|   | ||||
|  ok(verify("ee-pss-sha256-cert", "", ["root-cert"], ["ca-cert"], "-auth_level", "2"), | ||||
|      "PSS signature using SHA256 and auth level 2"); | ||||
| -- 
 | ||||
| 2.35.1 | ||||
| 
 | ||||
							
								
								
									
										188
									
								
								SOURCES/0053-CVE-2022-0778.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								SOURCES/0053-CVE-2022-0778.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,188 @@ | ||||
| From 23f1773ddf92979006d0f438523f3c73320c384f Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tomas@openssl.org> | ||||
| Date: Mon, 28 Feb 2022 18:26:30 +0100 | ||||
| Subject: [PATCH] Add documentation of BN_mod_sqrt() | ||||
| 
 | ||||
| ---
 | ||||
|  doc/man3/BN_add.pod    | 15 +++++++++++++-- | ||||
|  util/missingcrypto.txt |  1 - | ||||
|  2 files changed, 13 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| diff --git a/doc/man3/BN_add.pod b/doc/man3/BN_add.pod
 | ||||
| index 62d3ee7205..cf6c49c0e3 100644
 | ||||
| --- a/doc/man3/BN_add.pod
 | ||||
| +++ b/doc/man3/BN_add.pod
 | ||||
| @@ -3,7 +3,7 @@
 | ||||
|  =head1 NAME | ||||
|   | ||||
|  BN_add, BN_sub, BN_mul, BN_sqr, BN_div, BN_mod, BN_nnmod, BN_mod_add, | ||||
| -BN_mod_sub, BN_mod_mul, BN_mod_sqr, BN_exp, BN_mod_exp, BN_gcd -
 | ||||
| +BN_mod_sub, BN_mod_mul, BN_mod_sqr, BN_mod_sqrt, BN_exp, BN_mod_exp, BN_gcd -
 | ||||
|  arithmetic operations on BIGNUMs | ||||
|   | ||||
|  =head1 SYNOPSIS | ||||
| @@ -36,6 +36,8 @@ arithmetic operations on BIGNUMs
 | ||||
|   | ||||
|   int BN_mod_sqr(BIGNUM *r, BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); | ||||
|   | ||||
| + BIGNUM *BN_mod_sqrt(BIGNUM *in, BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
 | ||||
| +
 | ||||
|   int BN_exp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BN_CTX *ctx); | ||||
|   | ||||
|   int BN_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p, | ||||
| @@ -87,6 +89,12 @@ L<BN_mod_mul_reciprocal(3)>.
 | ||||
|  BN_mod_sqr() takes the square of I<a> modulo B<m> and places the | ||||
|  result in I<r>. | ||||
|   | ||||
| +BN_mod_sqrt() returns the modular square root of I<a> such that
 | ||||
| +C<in^2 = a (mod p)>. The modulus I<p> must be a
 | ||||
| +prime, otherwise an error or an incorrect "result" will be returned.
 | ||||
| +The result is stored into I<in> which can be NULL. The result will be
 | ||||
| +newly allocated in that case.
 | ||||
| +
 | ||||
|  BN_exp() raises I<a> to the I<p>-th power and places the result in I<r> | ||||
|  (C<r=a^p>). This function is faster than repeated applications of | ||||
|  BN_mul(). | ||||
| @@ -108,7 +116,10 @@ the arguments.
 | ||||
|   | ||||
|  =head1 RETURN VALUES | ||||
|   | ||||
| -For all functions, 1 is returned for success, 0 on error. The return
 | ||||
| +The BN_mod_sqrt() returns the result (possibly incorrect if I<p> is
 | ||||
| +not a prime), or NULL.
 | ||||
| +
 | ||||
| +For all remaining functions, 1 is returned for success, 0 on error. The return
 | ||||
|  value should always be checked (e.g., C<if (!BN_add(r,a,b)) goto err;>). | ||||
|  The error codes can be obtained by L<ERR_get_error(3)>. | ||||
|   | ||||
| diff --git a/util/missingcrypto.txt b/util/missingcrypto.txt
 | ||||
| index b61bdeb880..4d2fd7f6b7 100644
 | ||||
| --- a/util/missingcrypto.txt
 | ||||
| +++ b/util/missingcrypto.txt
 | ||||
| @@ -264,7 +264,6 @@ BN_mod_lshift(3)
 | ||||
|  BN_mod_lshift1(3) | ||||
|  BN_mod_lshift1_quick(3) | ||||
|  BN_mod_lshift_quick(3) | ||||
| -BN_mod_sqrt(3)
 | ||||
|  BN_mod_sub_quick(3) | ||||
|  BN_nist_mod_192(3) | ||||
|  BN_nist_mod_224(3) | ||||
| 
 | ||||
| From 46673310c9a755b2a56f53d115854983d6ada11a Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tomas@openssl.org> | ||||
| Date: Mon, 28 Feb 2022 18:26:35 +0100 | ||||
| Subject: [PATCH] Add a negative testcase for BN_mod_sqrt | ||||
| 
 | ||||
| ---
 | ||||
|  test/bntest.c                          | 11 ++++++++++- | ||||
|  test/recipes/10-test_bn_data/bnmod.txt | 12 ++++++++++++ | ||||
|  2 files changed, 22 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/test/bntest.c b/test/bntest.c
 | ||||
| index efdb3ef963..d49f87373a 100644
 | ||||
| --- a/test/bntest.c
 | ||||
| +++ b/test/bntest.c
 | ||||
| @@ -1732,8 +1732,17 @@ static int file_modsqrt(STANZA *s)
 | ||||
|              || !TEST_ptr(ret2 = BN_new())) | ||||
|          goto err; | ||||
|   | ||||
| +    if (BN_is_negative(mod_sqrt)) {
 | ||||
| +        /* A negative testcase */
 | ||||
| +        if (!TEST_ptr_null(BN_mod_sqrt(ret, a, p, ctx)))
 | ||||
| +            goto err;
 | ||||
| +
 | ||||
| +        st = 1;
 | ||||
| +        goto err;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      /* There are two possible answers. */ | ||||
| -    if (!TEST_true(BN_mod_sqrt(ret, a, p, ctx))
 | ||||
| +    if (!TEST_ptr(BN_mod_sqrt(ret, a, p, ctx))
 | ||||
|              || !TEST_true(BN_sub(ret2, p, ret))) | ||||
|          goto err; | ||||
|   | ||||
| diff --git a/test/recipes/10-test_bn_data/bnmod.txt b/test/recipes/10-test_bn_data/bnmod.txt
 | ||||
| index e22d656091..bc8a434ea5 100644
 | ||||
| --- a/test/recipes/10-test_bn_data/bnmod.txt
 | ||||
| +++ b/test/recipes/10-test_bn_data/bnmod.txt
 | ||||
| @@ -2799,3 +2799,15 @@ P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f
 | ||||
|  ModSqrt = a1d52989f12f204d3d2167d9b1e6c8a6174c0c786a979a5952383b7b8bd186 | ||||
|  A = 2eee37cf06228a387788188e650bc6d8a2ff402931443f69156a29155eca07dcb45f3aac238d92943c0c25c896098716baa433f25bd696a142f5a69d5d937e81 | ||||
|  P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f | ||||
| +
 | ||||
| +# Negative testcases for BN_mod_sqrt()
 | ||||
| +
 | ||||
| +# This one triggers an infinite loop with unfixed implementation
 | ||||
| +# It should just fail.
 | ||||
| +ModSqrt = -1
 | ||||
| +A = 20a7ee
 | ||||
| +P = 460201
 | ||||
| +
 | ||||
| +ModSqrt = -1
 | ||||
| +A = 65bebdb00a96fc814ec44b81f98b59fba3c30203928fa5214c51e0a97091645280c947b005847f239758482b9bfc45b066fde340d1fe32fc9c1bf02e1b2d0ed
 | ||||
| +P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f
 | ||||
| 
 | ||||
| From cafcc62d7719dea73f334c9ef763d1e215fcd94d Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tomas@openssl.org> | ||||
| Date: Mon, 28 Feb 2022 18:26:21 +0100 | ||||
| Subject: [PATCH] Fix possible infinite loop in BN_mod_sqrt() | ||||
| 
 | ||||
| The calculation in some cases does not finish for non-prime p. | ||||
| 
 | ||||
| This fixes CVE-2022-0778. | ||||
| 
 | ||||
| Based on patch by David Benjamin <davidben@google.com>. | ||||
| ---
 | ||||
|  crypto/bn/bn_sqrt.c | 30 ++++++++++++++++++------------ | ||||
|  1 file changed, 18 insertions(+), 12 deletions(-) | ||||
| 
 | ||||
| diff --git a/crypto/bn/bn_sqrt.c b/crypto/bn/bn_sqrt.c
 | ||||
| index b663ae5ec5..c5ea7ab194 100644
 | ||||
| --- a/crypto/bn/bn_sqrt.c
 | ||||
| +++ b/crypto/bn/bn_sqrt.c
 | ||||
| @@ -14,7 +14,8 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
 | ||||
|  /* | ||||
|   * Returns 'ret' such that ret^2 == a (mod p), using the Tonelli/Shanks | ||||
|   * algorithm (cf. Henri Cohen, "A Course in Algebraic Computational Number | ||||
| - * Theory", algorithm 1.5.1). 'p' must be prime!
 | ||||
| + * Theory", algorithm 1.5.1). 'p' must be prime, otherwise an error or
 | ||||
| + * an incorrect "result" will be returned.
 | ||||
|   */ | ||||
|  { | ||||
|      BIGNUM *ret = in; | ||||
| @@ -303,18 +304,23 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
 | ||||
|              goto vrfy; | ||||
|          } | ||||
|   | ||||
| -        /* find smallest  i  such that  b^(2^i) = 1 */
 | ||||
| -        i = 1;
 | ||||
| -        if (!BN_mod_sqr(t, b, p, ctx))
 | ||||
| -            goto end;
 | ||||
| -        while (!BN_is_one(t)) {
 | ||||
| -            i++;
 | ||||
| -            if (i == e) {
 | ||||
| -                ERR_raise(ERR_LIB_BN, BN_R_NOT_A_SQUARE);
 | ||||
| -                goto end;
 | ||||
| +        /* Find the smallest i, 0 < i < e, such that b^(2^i) = 1. */
 | ||||
| +        for (i = 1; i < e; i++) {
 | ||||
| +            if (i == 1) {
 | ||||
| +                if (!BN_mod_sqr(t, b, p, ctx))
 | ||||
| +                    goto end;
 | ||||
| +
 | ||||
| +            } else {
 | ||||
| +                if (!BN_mod_mul(t, t, t, p, ctx))
 | ||||
| +                    goto end;
 | ||||
|              } | ||||
| -            if (!BN_mod_mul(t, t, t, p, ctx))
 | ||||
| -                goto end;
 | ||||
| +            if (BN_is_one(t))
 | ||||
| +                break;
 | ||||
| +        }
 | ||||
| +        /* If not found, a is not a square or p is not prime. */
 | ||||
| +        if (i >= e) {
 | ||||
| +            ERR_raise(ERR_LIB_BN, BN_R_NOT_A_SQUARE);
 | ||||
| +            goto end;
 | ||||
|          } | ||||
|   | ||||
|          /* t := y^2^(e - i - 1) */ | ||||
| 
 | ||||
							
								
								
									
										82
									
								
								SOURCES/Makefile.certificate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								SOURCES/Makefile.certificate
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,82 @@ | ||||
| UTF8 := $(shell locale -c LC_CTYPE -k | grep -q charmap.*UTF-8 && echo -utf8) | ||||
| DAYS=365 | ||||
| KEYLEN=2048 | ||||
| TYPE=rsa:$(KEYLEN) | ||||
| EXTRA_FLAGS= | ||||
| ifdef SERIAL | ||||
| 	EXTRA_FLAGS+=-set_serial $(SERIAL) | ||||
| endif | ||||
| 
 | ||||
| .PHONY: usage | ||||
| .SUFFIXES: .key .csr .crt .pem | ||||
| .PRECIOUS: %.key %.csr %.crt %.pem | ||||
| 
 | ||||
| usage: | ||||
| 	@echo "This makefile allows you to create:" | ||||
| 	@echo "  o public/private key pairs" | ||||
| 	@echo "  o SSL certificate signing requests (CSRs)" | ||||
| 	@echo "  o self-signed SSL test certificates" | ||||
| 	@echo | ||||
| 	@echo "To create a key pair, run \"make SOMETHING.key\"." | ||||
| 	@echo "To create a CSR, run \"make SOMETHING.csr\"." | ||||
| 	@echo "To create a test certificate, run \"make SOMETHING.crt\"." | ||||
| 	@echo "To create a key and a test certificate in one file, run \"make SOMETHING.pem\"." | ||||
| 	@echo | ||||
| 	@echo "To create a key for use with Apache, run \"make genkey\"." | ||||
| 	@echo "To create a CSR for use with Apache, run \"make certreq\"." | ||||
| 	@echo "To create a test certificate for use with Apache, run \"make testcert\"." | ||||
| 	@echo | ||||
| 	@echo "To create a test certificate with serial number other than random, add SERIAL=num" | ||||
| 	@echo "You can also specify key length with KEYLEN=n and expiration in days with DAYS=n" | ||||
| 	@echo "Any additional options can be passed to openssl req via EXTRA_FLAGS" | ||||
| 	@echo | ||||
| 	@echo Examples: | ||||
| 	@echo "  make server.key" | ||||
| 	@echo "  make server.csr" | ||||
| 	@echo "  make server.crt" | ||||
| 	@echo "  make stunnel.pem" | ||||
| 	@echo "  make genkey" | ||||
| 	@echo "  make certreq" | ||||
| 	@echo "  make testcert" | ||||
| 	@echo "  make server.crt SERIAL=1" | ||||
| 	@echo "  make stunnel.pem EXTRA_FLAGS=-sha384" | ||||
| 	@echo "  make testcert DAYS=600" | ||||
| 
 | ||||
| %.pem: | ||||
| 	umask 77 ; \
 | ||||
| 	PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
 | ||||
| 	PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
 | ||||
| 	/usr/bin/openssl req $(UTF8) -newkey $(TYPE) -keyout $$PEM1 -nodes -x509 -days $(DAYS) -out $$PEM2 $(EXTRA_FLAGS) ; \
 | ||||
| 	cat $$PEM1 >  $@ ; \
 | ||||
| 	echo ""    >> $@ ; \
 | ||||
| 	cat $$PEM2 >> $@ ; \
 | ||||
| 	$(RM) $$PEM1 $$PEM2 | ||||
| 
 | ||||
| %.key: | ||||
| 	umask 77 ; \
 | ||||
| 	/usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@ | ||||
| 
 | ||||
| %.csr: %.key | ||||
| 	umask 77 ; \
 | ||||
| 	/usr/bin/openssl req $(UTF8) -new -key $^ -out $@ | ||||
| 
 | ||||
| %.crt: %.key | ||||
| 	umask 77 ; \
 | ||||
| 	/usr/bin/openssl req $(UTF8) -new -key $^ -x509 -days $(DAYS) -out $@ $(EXTRA_FLAGS) | ||||
| 
 | ||||
| TLSROOT=/etc/pki/tls | ||||
| KEY=$(TLSROOT)/private/localhost.key | ||||
| CSR=$(TLSROOT)/certs/localhost.csr | ||||
| CRT=$(TLSROOT)/certs/localhost.crt | ||||
| 
 | ||||
| genkey: $(KEY) | ||||
| certreq: $(CSR) | ||||
| testcert: $(CRT) | ||||
| 
 | ||||
| $(CSR): $(KEY) | ||||
| 	umask 77 ; \
 | ||||
| 	/usr/bin/openssl req $(UTF8) -new -key $(KEY) -out $(CSR) | ||||
| 
 | ||||
| $(CRT): $(KEY) | ||||
| 	umask 77 ; \
 | ||||
| 	/usr/bin/openssl req $(UTF8) -new -key $(KEY) -x509 -days $(DAYS) -out $(CRT) $(EXTRA_FLAGS) | ||||
							
								
								
									
										7
									
								
								SOURCES/configuration-prefix.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								SOURCES/configuration-prefix.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| /* Prepended at openssl package build-time.  Don't include this file directly,
 | ||||
|  * use <openssl/opensslconf.h> instead. */ | ||||
| 
 | ||||
| #ifndef openssl_conf_multilib_redirection_h | ||||
| #error "Don't include this file directly, use <openssl/opensslconf.h> instead!" | ||||
| #endif | ||||
| 
 | ||||
							
								
								
									
										47
									
								
								SOURCES/configuration-switch.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								SOURCES/configuration-switch.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | ||||
| /* This file is here to prevent a file conflict on multiarch systems.  A
 | ||||
|  * conflict will frequently occur because arch-specific build-time | ||||
|  * configuration options are stored (and used, so they can't just be stripped | ||||
|  * out) in configuration.h.  The original configuration.h has been renamed. | ||||
|  * DO NOT INCLUDE THE NEW FILE DIRECTLY -- ALWAYS INCLUDE THIS ONE INSTEAD. */ | ||||
| 
 | ||||
| #ifdef openssl_conf_multilib_redirection_h | ||||
| #error "Do not define openssl_conf_multilib_redirection_h!" | ||||
| #endif | ||||
| #define openssl_conf_multilib_redirection_h | ||||
| 
 | ||||
| #if defined(__i386__) | ||||
| #include "configuration-i386.h" | ||||
| #elif defined(__ia64__) | ||||
| #include "configuration-ia64.h" | ||||
| #elif defined(__mips64) && defined(__MIPSEL__) | ||||
| #include "configuration-mips64el.h" | ||||
| #elif defined(__mips64) | ||||
| #include "configuration-mips64.h" | ||||
| #elif defined(__mips) && defined(__MIPSEL__) | ||||
| #include "configuration-mipsel.h" | ||||
| #elif defined(__mips) | ||||
| #include "configuration-mips.h" | ||||
| #elif defined(__powerpc64__) | ||||
| #include <endian.h> | ||||
| #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ | ||||
| #include "configuration-ppc64.h" | ||||
| #else | ||||
| #include "configuration-ppc64le.h" | ||||
| #endif | ||||
| #elif defined(__powerpc__) | ||||
| #include "configuration-ppc.h" | ||||
| #elif defined(__s390x__) | ||||
| #include "configuration-s390x.h" | ||||
| #elif defined(__s390__) | ||||
| #include "configuration-s390.h" | ||||
| #elif defined(__sparc__) && defined(__arch64__) | ||||
| #include "configuration-sparc64.h" | ||||
| #elif defined(__sparc__) | ||||
| #include "configuration-sparc.h" | ||||
| #elif defined(__x86_64__) | ||||
| #include "configuration-x86_64.h" | ||||
| #else | ||||
| #error "The openssl-devel package does not work your architecture?" | ||||
| #endif | ||||
| 
 | ||||
| #undef openssl_conf_multilib_redirection_h | ||||
							
								
								
									
										628
									
								
								SOURCES/ec_curve.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										628
									
								
								SOURCES/ec_curve.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,628 @@ | ||||
| /*
 | ||||
|  * Copyright 2002-2021 The OpenSSL Project Authors. All Rights Reserved. | ||||
|  * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved | ||||
|  * | ||||
|  * Licensed under the Apache License 2.0 (the "License").  You may not use | ||||
|  * this file except in compliance with the License.  You can obtain a copy | ||||
|  * in the file LICENSE in the source distribution or at | ||||
|  * https://www.openssl.org/source/license.html
 | ||||
|  */ | ||||
| 
 | ||||
| /*
 | ||||
|  * ECDSA low level APIs are deprecated for public use, but still ok for | ||||
|  * internal use. | ||||
|  */ | ||||
| #include "internal/deprecated.h" | ||||
| 
 | ||||
| #include <string.h> | ||||
| #include "ec_local.h" | ||||
| #include <openssl/err.h> | ||||
| #include <openssl/obj_mac.h> | ||||
| #include <openssl/objects.h> | ||||
| #include <openssl/opensslconf.h> | ||||
| #include "internal/nelem.h" | ||||
| 
 | ||||
| typedef struct { | ||||
|     int field_type,             /* either NID_X9_62_prime_field or
 | ||||
|                                  * NID_X9_62_characteristic_two_field */ | ||||
|      seed_len, param_len; | ||||
|     unsigned int cofactor;      /* promoted to BN_ULONG */ | ||||
| } EC_CURVE_DATA; | ||||
| 
 | ||||
| /* the nist prime curves */ | ||||
| static const struct { | ||||
|     EC_CURVE_DATA h; | ||||
|     unsigned char data[20 + 28 * 6]; | ||||
| } _EC_NIST_PRIME_224 = { | ||||
|     { | ||||
|         NID_X9_62_prime_field, 20, 28, 1 | ||||
|     }, | ||||
|     { | ||||
|         /* seed */ | ||||
|         0xBD, 0x71, 0x34, 0x47, 0x99, 0xD5, 0xC7, 0xFC, 0xDC, 0x45, 0xB5, 0x9F, | ||||
|         0xA3, 0xB9, 0xAB, 0x8F, 0x6A, 0x94, 0x8B, 0xC5, | ||||
|         /* p */ | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|         0x00, 0x00, 0x00, 0x01, | ||||
|         /* a */ | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFE, | ||||
|         /* b */ | ||||
|         0xB4, 0x05, 0x0A, 0x85, 0x0C, 0x04, 0xB3, 0xAB, 0xF5, 0x41, 0x32, 0x56, | ||||
|         0x50, 0x44, 0xB0, 0xB7, 0xD7, 0xBF, 0xD8, 0xBA, 0x27, 0x0B, 0x39, 0x43, | ||||
|         0x23, 0x55, 0xFF, 0xB4, | ||||
|         /* x */ | ||||
|         0xB7, 0x0E, 0x0C, 0xBD, 0x6B, 0xB4, 0xBF, 0x7F, 0x32, 0x13, 0x90, 0xB9, | ||||
|         0x4A, 0x03, 0xC1, 0xD3, 0x56, 0xC2, 0x11, 0x22, 0x34, 0x32, 0x80, 0xD6, | ||||
|         0x11, 0x5C, 0x1D, 0x21, | ||||
|         /* y */ | ||||
|         0xbd, 0x37, 0x63, 0x88, 0xb5, 0xf7, 0x23, 0xfb, 0x4c, 0x22, 0xdf, 0xe6, | ||||
|         0xcd, 0x43, 0x75, 0xa0, 0x5a, 0x07, 0x47, 0x64, 0x44, 0xd5, 0x81, 0x99, | ||||
|         0x85, 0x00, 0x7e, 0x34, | ||||
|         /* order */ | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0x16, 0xA2, 0xE0, 0xB8, 0xF0, 0x3E, 0x13, 0xDD, 0x29, 0x45, | ||||
|         0x5C, 0x5C, 0x2A, 0x3D | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| static const struct { | ||||
|     EC_CURVE_DATA h; | ||||
|     unsigned char data[20 + 48 * 6]; | ||||
| } _EC_NIST_PRIME_384 = { | ||||
|     { | ||||
|         NID_X9_62_prime_field, 20, 48, 1 | ||||
|     }, | ||||
|     { | ||||
|         /* seed */ | ||||
|         0xA3, 0x35, 0x92, 0x6A, 0xA3, 0x19, 0xA2, 0x7A, 0x1D, 0x00, 0x89, 0x6A, | ||||
|         0x67, 0x73, 0xA4, 0x82, 0x7A, 0xCD, 0xAC, 0x73, | ||||
|         /* p */ | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         /* a */ | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, | ||||
|         /* b */ | ||||
|         0xB3, 0x31, 0x2F, 0xA7, 0xE2, 0x3E, 0xE7, 0xE4, 0x98, 0x8E, 0x05, 0x6B, | ||||
|         0xE3, 0xF8, 0x2D, 0x19, 0x18, 0x1D, 0x9C, 0x6E, 0xFE, 0x81, 0x41, 0x12, | ||||
|         0x03, 0x14, 0x08, 0x8F, 0x50, 0x13, 0x87, 0x5A, 0xC6, 0x56, 0x39, 0x8D, | ||||
|         0x8A, 0x2E, 0xD1, 0x9D, 0x2A, 0x85, 0xC8, 0xED, 0xD3, 0xEC, 0x2A, 0xEF, | ||||
|         /* x */ | ||||
|         0xAA, 0x87, 0xCA, 0x22, 0xBE, 0x8B, 0x05, 0x37, 0x8E, 0xB1, 0xC7, 0x1E, | ||||
|         0xF3, 0x20, 0xAD, 0x74, 0x6E, 0x1D, 0x3B, 0x62, 0x8B, 0xA7, 0x9B, 0x98, | ||||
|         0x59, 0xF7, 0x41, 0xE0, 0x82, 0x54, 0x2A, 0x38, 0x55, 0x02, 0xF2, 0x5D, | ||||
|         0xBF, 0x55, 0x29, 0x6C, 0x3A, 0x54, 0x5E, 0x38, 0x72, 0x76, 0x0A, 0xB7, | ||||
|         /* y */ | ||||
|         0x36, 0x17, 0xde, 0x4a, 0x96, 0x26, 0x2c, 0x6f, 0x5d, 0x9e, 0x98, 0xbf, | ||||
|         0x92, 0x92, 0xdc, 0x29, 0xf8, 0xf4, 0x1d, 0xbd, 0x28, 0x9a, 0x14, 0x7c, | ||||
|         0xe9, 0xda, 0x31, 0x13, 0xb5, 0xf0, 0xb8, 0xc0, 0x0a, 0x60, 0xb1, 0xce, | ||||
|         0x1d, 0x7e, 0x81, 0x9d, 0x7a, 0x43, 0x1d, 0x7c, 0x90, 0xea, 0x0e, 0x5f, | ||||
|         /* order */ | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xC7, 0x63, 0x4D, 0x81, 0xF4, 0x37, 0x2D, 0xDF, 0x58, 0x1A, 0x0D, 0xB2, | ||||
|         0x48, 0xB0, 0xA7, 0x7A, 0xEC, 0xEC, 0x19, 0x6A, 0xCC, 0xC5, 0x29, 0x73 | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| static const struct { | ||||
|     EC_CURVE_DATA h; | ||||
|     unsigned char data[20 + 66 * 6]; | ||||
| } _EC_NIST_PRIME_521 = { | ||||
|     { | ||||
|         NID_X9_62_prime_field, 20, 66, 1 | ||||
|     }, | ||||
|     { | ||||
|         /* seed */ | ||||
|         0xD0, 0x9E, 0x88, 0x00, 0x29, 0x1C, 0xB8, 0x53, 0x96, 0xCC, 0x67, 0x17, | ||||
|         0x39, 0x32, 0x84, 0xAA, 0xA0, 0xDA, 0x64, 0xBA, | ||||
|         /* p */ | ||||
|         0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         /* a */ | ||||
|         0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, | ||||
|         /* b */ | ||||
|         0x00, 0x51, 0x95, 0x3E, 0xB9, 0x61, 0x8E, 0x1C, 0x9A, 0x1F, 0x92, 0x9A, | ||||
|         0x21, 0xA0, 0xB6, 0x85, 0x40, 0xEE, 0xA2, 0xDA, 0x72, 0x5B, 0x99, 0xB3, | ||||
|         0x15, 0xF3, 0xB8, 0xB4, 0x89, 0x91, 0x8E, 0xF1, 0x09, 0xE1, 0x56, 0x19, | ||||
|         0x39, 0x51, 0xEC, 0x7E, 0x93, 0x7B, 0x16, 0x52, 0xC0, 0xBD, 0x3B, 0xB1, | ||||
|         0xBF, 0x07, 0x35, 0x73, 0xDF, 0x88, 0x3D, 0x2C, 0x34, 0xF1, 0xEF, 0x45, | ||||
|         0x1F, 0xD4, 0x6B, 0x50, 0x3F, 0x00, | ||||
|         /* x */ | ||||
|         0x00, 0xC6, 0x85, 0x8E, 0x06, 0xB7, 0x04, 0x04, 0xE9, 0xCD, 0x9E, 0x3E, | ||||
|         0xCB, 0x66, 0x23, 0x95, 0xB4, 0x42, 0x9C, 0x64, 0x81, 0x39, 0x05, 0x3F, | ||||
|         0xB5, 0x21, 0xF8, 0x28, 0xAF, 0x60, 0x6B, 0x4D, 0x3D, 0xBA, 0xA1, 0x4B, | ||||
|         0x5E, 0x77, 0xEF, 0xE7, 0x59, 0x28, 0xFE, 0x1D, 0xC1, 0x27, 0xA2, 0xFF, | ||||
|         0xA8, 0xDE, 0x33, 0x48, 0xB3, 0xC1, 0x85, 0x6A, 0x42, 0x9B, 0xF9, 0x7E, | ||||
|         0x7E, 0x31, 0xC2, 0xE5, 0xBD, 0x66, | ||||
|         /* y */ | ||||
|         0x01, 0x18, 0x39, 0x29, 0x6a, 0x78, 0x9a, 0x3b, 0xc0, 0x04, 0x5c, 0x8a, | ||||
|         0x5f, 0xb4, 0x2c, 0x7d, 0x1b, 0xd9, 0x98, 0xf5, 0x44, 0x49, 0x57, 0x9b, | ||||
|         0x44, 0x68, 0x17, 0xaf, 0xbd, 0x17, 0x27, 0x3e, 0x66, 0x2c, 0x97, 0xee, | ||||
|         0x72, 0x99, 0x5e, 0xf4, 0x26, 0x40, 0xc5, 0x50, 0xb9, 0x01, 0x3f, 0xad, | ||||
|         0x07, 0x61, 0x35, 0x3c, 0x70, 0x86, 0xa2, 0x72, 0xc2, 0x40, 0x88, 0xbe, | ||||
|         0x94, 0x76, 0x9f, 0xd1, 0x66, 0x50, | ||||
|         /* order */ | ||||
|         0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x51, 0x86, | ||||
|         0x87, 0x83, 0xBF, 0x2F, 0x96, 0x6B, 0x7F, 0xCC, 0x01, 0x48, 0xF7, 0x09, | ||||
|         0xA5, 0xD0, 0x3B, 0xB5, 0xC9, 0xB8, 0x89, 0x9C, 0x47, 0xAE, 0xBB, 0x6F, | ||||
|         0xB7, 0x1E, 0x91, 0x38, 0x64, 0x09 | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| static const struct { | ||||
|     EC_CURVE_DATA h; | ||||
|     unsigned char data[20 + 32 * 6]; | ||||
| } _EC_X9_62_PRIME_256V1 = { | ||||
|     { | ||||
|         NID_X9_62_prime_field, 20, 32, 1 | ||||
|     }, | ||||
|     { | ||||
|         /* seed */ | ||||
|         0xC4, 0x9D, 0x36, 0x08, 0x86, 0xE7, 0x04, 0x93, 0x6A, 0x66, 0x78, 0xE1, | ||||
|         0x13, 0x9D, 0x26, 0xB7, 0x81, 0x9F, 0x7E, 0x90, | ||||
|         /* p */ | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | ||||
|         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         /* a */ | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | ||||
|         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, | ||||
|         /* b */ | ||||
|         0x5A, 0xC6, 0x35, 0xD8, 0xAA, 0x3A, 0x93, 0xE7, 0xB3, 0xEB, 0xBD, 0x55, | ||||
|         0x76, 0x98, 0x86, 0xBC, 0x65, 0x1D, 0x06, 0xB0, 0xCC, 0x53, 0xB0, 0xF6, | ||||
|         0x3B, 0xCE, 0x3C, 0x3E, 0x27, 0xD2, 0x60, 0x4B, | ||||
|         /* x */ | ||||
|         0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6, 0xE5, | ||||
|         0x63, 0xA4, 0x40, 0xF2, 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB, 0x33, 0xA0, | ||||
|         0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98, 0xC2, 0x96, | ||||
|         /* y */ | ||||
|         0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, 0x8e, 0xe7, 0xeb, 0x4a, | ||||
|         0x7c, 0x0f, 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce, | ||||
|         0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5, | ||||
|         /* order */ | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84, | ||||
|         0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51 | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| static const struct { | ||||
|     EC_CURVE_DATA h; | ||||
|     unsigned char data[0 + 32 * 6]; | ||||
| } _EC_SECG_PRIME_256K1 = { | ||||
|     { | ||||
|         NID_X9_62_prime_field, 0, 32, 1 | ||||
|     }, | ||||
|     { | ||||
|         /* no seed */ | ||||
|         /* p */ | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x2F, | ||||
|         /* a */ | ||||
|         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|         /* b */ | ||||
|         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, | ||||
|         /* x */ | ||||
|         0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, | ||||
|         0xCE, 0x87, 0x0B, 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, | ||||
|         0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98, | ||||
|         /* y */ | ||||
|         0x48, 0x3a, 0xda, 0x77, 0x26, 0xa3, 0xc4, 0x65, 0x5d, 0xa4, 0xfb, 0xfc, | ||||
|         0x0e, 0x11, 0x08, 0xa8, 0xfd, 0x17, 0xb4, 0x48, 0xa6, 0x85, 0x54, 0x19, | ||||
|         0x9c, 0x47, 0xd0, 0x8f, 0xfb, 0x10, 0xd4, 0xb8, | ||||
|         /* order */ | ||||
|         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
|         0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B, | ||||
|         0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41 | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| typedef struct _ec_list_element_st { | ||||
|     int nid; | ||||
|     const EC_CURVE_DATA *data; | ||||
|     const EC_METHOD *(*meth) (void); | ||||
|     const char *comment; | ||||
| } ec_list_element; | ||||
| 
 | ||||
| #ifdef FIPS_MODULE | ||||
| static const ec_list_element curve_list[] = { | ||||
|     /* prime field curves */ | ||||
|     /* secg curves */ | ||||
|     {NID_secp224r1, &_EC_NIST_PRIME_224.h, | ||||
| # if !defined(OPENSSL_NO_EC_NISTP_64_GCC_128) | ||||
|      EC_GFp_nistp224_method, | ||||
| # else | ||||
|      0, | ||||
| # endif | ||||
|      "NIST/SECG curve over a 224 bit prime field"}, | ||||
|     /* SECG secp256r1 is the same as X9.62 prime256v1 and hence omitted */ | ||||
|     {NID_secp384r1, &_EC_NIST_PRIME_384.h, | ||||
| # if defined(S390X_EC_ASM) | ||||
|      EC_GFp_s390x_nistp384_method, | ||||
| # else | ||||
|      0, | ||||
| # endif | ||||
|      "NIST/SECG curve over a 384 bit prime field"}, | ||||
| 
 | ||||
|     {NID_secp521r1, &_EC_NIST_PRIME_521.h, | ||||
| # if defined(S390X_EC_ASM) | ||||
|      EC_GFp_s390x_nistp521_method, | ||||
| # elif !defined(OPENSSL_NO_EC_NISTP_64_GCC_128) | ||||
|      EC_GFp_nistp521_method, | ||||
| # else | ||||
|      0, | ||||
| # endif | ||||
|      "NIST/SECG curve over a 521 bit prime field"}, | ||||
| 
 | ||||
|     /* X9.62 curves */ | ||||
|     {NID_X9_62_prime256v1, &_EC_X9_62_PRIME_256V1.h, | ||||
| # if defined(ECP_NISTZ256_ASM) | ||||
|      EC_GFp_nistz256_method, | ||||
| # elif defined(S390X_EC_ASM) | ||||
|      EC_GFp_s390x_nistp256_method, | ||||
| # elif !defined(OPENSSL_NO_EC_NISTP_64_GCC_128) | ||||
|      EC_GFp_nistp256_method, | ||||
| # else | ||||
|      0, | ||||
| # endif | ||||
|      "X9.62/SECG curve over a 256 bit prime field"}, | ||||
| }; | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| static const ec_list_element curve_list[] = { | ||||
|     /* prime field curves */ | ||||
|     /* secg curves */ | ||||
| # ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 | ||||
|     {NID_secp224r1, &_EC_NIST_PRIME_224.h, EC_GFp_nistp224_method, | ||||
|      "NIST/SECG curve over a 224 bit prime field"}, | ||||
| # else | ||||
|     {NID_secp224r1, &_EC_NIST_PRIME_224.h, 0, | ||||
|      "NIST/SECG curve over a 224 bit prime field"}, | ||||
| # endif | ||||
|     {NID_secp256k1, &_EC_SECG_PRIME_256K1.h, 0, | ||||
|      "SECG curve over a 256 bit prime field"}, | ||||
|     /* SECG secp256r1 is the same as X9.62 prime256v1 and hence omitted */ | ||||
|     {NID_secp384r1, &_EC_NIST_PRIME_384.h, | ||||
| # if defined(S390X_EC_ASM) | ||||
|      EC_GFp_s390x_nistp384_method, | ||||
| # else | ||||
|      0, | ||||
| # endif | ||||
|      "NIST/SECG curve over a 384 bit prime field"}, | ||||
|     {NID_secp521r1, &_EC_NIST_PRIME_521.h, | ||||
| # if defined(S390X_EC_ASM) | ||||
|      EC_GFp_s390x_nistp521_method, | ||||
| # elif !defined(OPENSSL_NO_EC_NISTP_64_GCC_128) | ||||
|      EC_GFp_nistp521_method, | ||||
| # else | ||||
|      0, | ||||
| # endif | ||||
|      "NIST/SECG curve over a 521 bit prime field"}, | ||||
|     /* X9.62 curves */ | ||||
|     {NID_X9_62_prime256v1, &_EC_X9_62_PRIME_256V1.h, | ||||
| # if defined(ECP_NISTZ256_ASM) | ||||
|      EC_GFp_nistz256_method, | ||||
| # elif defined(S390X_EC_ASM) | ||||
|      EC_GFp_s390x_nistp256_method, | ||||
| # elif !defined(OPENSSL_NO_EC_NISTP_64_GCC_128) | ||||
|      EC_GFp_nistp256_method, | ||||
| # else | ||||
|      0, | ||||
| # endif | ||||
|      "X9.62/SECG curve over a 256 bit prime field"}, | ||||
| }; | ||||
| #endif /* FIPS_MODULE */ | ||||
| 
 | ||||
| #define curve_list_length OSSL_NELEM(curve_list) | ||||
| 
 | ||||
| static const ec_list_element *ec_curve_nid2curve(int nid) | ||||
| { | ||||
|     size_t i; | ||||
| 
 | ||||
|     if (nid <= 0) | ||||
|         return NULL; | ||||
| 
 | ||||
|     for (i = 0; i < curve_list_length; i++) { | ||||
|         if (curve_list[i].nid == nid) | ||||
|             return &curve_list[i]; | ||||
|     } | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| static EC_GROUP *ec_group_new_from_data(OSSL_LIB_CTX *libctx, | ||||
|                                         const char *propq, | ||||
|                                         const ec_list_element curve) | ||||
| { | ||||
|     EC_GROUP *group = NULL; | ||||
|     EC_POINT *P = NULL; | ||||
|     BN_CTX *ctx = NULL; | ||||
|     BIGNUM *p = NULL, *a = NULL, *b = NULL, *x = NULL, *y = NULL, *order = | ||||
|         NULL; | ||||
|     int ok = 0; | ||||
|     int seed_len, param_len; | ||||
|     const EC_METHOD *meth; | ||||
|     const EC_CURVE_DATA *data; | ||||
|     const unsigned char *params; | ||||
| 
 | ||||
|     /* If no curve data curve method must handle everything */ | ||||
|     if (curve.data == NULL) | ||||
|         return ossl_ec_group_new_ex(libctx, propq, | ||||
|                                     curve.meth != NULL ? curve.meth() : NULL); | ||||
| 
 | ||||
|     if ((ctx = BN_CTX_new_ex(libctx)) == NULL) { | ||||
|         ERR_raise(ERR_LIB_EC, ERR_R_MALLOC_FAILURE); | ||||
|         goto err; | ||||
|     } | ||||
| 
 | ||||
|     data = curve.data; | ||||
|     seed_len = data->seed_len; | ||||
|     param_len = data->param_len; | ||||
|     params = (const unsigned char *)(data + 1); /* skip header */ | ||||
|     params += seed_len;         /* skip seed */ | ||||
| 
 | ||||
|     if ((p = BN_bin2bn(params + 0 * param_len, param_len, NULL)) == NULL | ||||
|         || (a = BN_bin2bn(params + 1 * param_len, param_len, NULL)) == NULL | ||||
|         || (b = BN_bin2bn(params + 2 * param_len, param_len, NULL)) == NULL) { | ||||
|         ERR_raise(ERR_LIB_EC, ERR_R_BN_LIB); | ||||
|         goto err; | ||||
|     } | ||||
| 
 | ||||
|     if (curve.meth != 0) { | ||||
|         meth = curve.meth(); | ||||
|         if (((group = ossl_ec_group_new_ex(libctx, propq, meth)) == NULL) || | ||||
|             (!(group->meth->group_set_curve(group, p, a, b, ctx)))) { | ||||
|             ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB); | ||||
|             goto err; | ||||
|         } | ||||
|     } else if (data->field_type == NID_X9_62_prime_field) { | ||||
|         if ((group = EC_GROUP_new_curve_GFp(p, a, b, ctx)) == NULL) { | ||||
|             ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB); | ||||
|             goto err; | ||||
|         } | ||||
|     } | ||||
| #ifndef OPENSSL_NO_EC2M | ||||
|     else {                      /* field_type ==
 | ||||
|                                  * NID_X9_62_characteristic_two_field */ | ||||
| 
 | ||||
|         if ((group = EC_GROUP_new_curve_GF2m(p, a, b, ctx)) == NULL) { | ||||
|             ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB); | ||||
|             goto err; | ||||
|         } | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     EC_GROUP_set_curve_name(group, curve.nid); | ||||
| 
 | ||||
|     if ((P = EC_POINT_new(group)) == NULL) { | ||||
|         ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB); | ||||
|         goto err; | ||||
|     } | ||||
| 
 | ||||
|     if ((x = BN_bin2bn(params + 3 * param_len, param_len, NULL)) == NULL | ||||
|         || (y = BN_bin2bn(params + 4 * param_len, param_len, NULL)) == NULL) { | ||||
|         ERR_raise(ERR_LIB_EC, ERR_R_BN_LIB); | ||||
|         goto err; | ||||
|     } | ||||
|     if (!EC_POINT_set_affine_coordinates(group, P, x, y, ctx)) { | ||||
|         ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB); | ||||
|         goto err; | ||||
|     } | ||||
|     if ((order = BN_bin2bn(params + 5 * param_len, param_len, NULL)) == NULL | ||||
|         || !BN_set_word(x, (BN_ULONG)data->cofactor)) { | ||||
|         ERR_raise(ERR_LIB_EC, ERR_R_BN_LIB); | ||||
|         goto err; | ||||
|     } | ||||
|     if (!EC_GROUP_set_generator(group, P, order, x)) { | ||||
|         ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB); | ||||
|         goto err; | ||||
|     } | ||||
|     if (seed_len) { | ||||
|         if (!EC_GROUP_set_seed(group, params - seed_len, seed_len)) { | ||||
|             ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB); | ||||
|             goto err; | ||||
|         } | ||||
|     } | ||||
|     ok = 1; | ||||
|  err: | ||||
|     if (!ok) { | ||||
|         EC_GROUP_free(group); | ||||
|         group = NULL; | ||||
|     } | ||||
|     EC_POINT_free(P); | ||||
|     BN_CTX_free(ctx); | ||||
|     BN_free(p); | ||||
|     BN_free(a); | ||||
|     BN_free(b); | ||||
|     BN_free(order); | ||||
|     BN_free(x); | ||||
|     BN_free(y); | ||||
|     return group; | ||||
| } | ||||
| 
 | ||||
| EC_GROUP *EC_GROUP_new_by_curve_name_ex(OSSL_LIB_CTX *libctx, const char *propq, | ||||
|                                         int nid) | ||||
| { | ||||
|     EC_GROUP *ret = NULL; | ||||
|     const ec_list_element *curve; | ||||
| 
 | ||||
|     if ((curve = ec_curve_nid2curve(nid)) == NULL | ||||
|         || (ret = ec_group_new_from_data(libctx, propq, *curve)) == NULL) { | ||||
| #ifndef FIPS_MODULE | ||||
|         ERR_raise_data(ERR_LIB_EC, EC_R_UNKNOWN_GROUP, | ||||
|                        "name=%s", OBJ_nid2sn(nid)); | ||||
| #else | ||||
|         ERR_raise(ERR_LIB_EC, EC_R_UNKNOWN_GROUP); | ||||
| #endif | ||||
|         return NULL; | ||||
|     } | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| #ifndef FIPS_MODULE | ||||
| EC_GROUP *EC_GROUP_new_by_curve_name(int nid) | ||||
| { | ||||
|     return EC_GROUP_new_by_curve_name_ex(NULL, NULL, nid); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems) | ||||
| { | ||||
|     size_t i, min; | ||||
| 
 | ||||
|     if (r == NULL || nitems == 0) | ||||
|         return curve_list_length; | ||||
| 
 | ||||
|     min = nitems < curve_list_length ? nitems : curve_list_length; | ||||
| 
 | ||||
|     for (i = 0; i < min; i++) { | ||||
|         r[i].nid = curve_list[i].nid; | ||||
|         r[i].comment = curve_list[i].comment; | ||||
|     } | ||||
| 
 | ||||
|     return curve_list_length; | ||||
| } | ||||
| 
 | ||||
| const char *EC_curve_nid2nist(int nid) | ||||
| { | ||||
|     return ossl_ec_curve_nid2nist_int(nid); | ||||
| } | ||||
| 
 | ||||
| int EC_curve_nist2nid(const char *name) | ||||
| { | ||||
|     return ossl_ec_curve_nist2nid_int(name); | ||||
| } | ||||
| 
 | ||||
| #define NUM_BN_FIELDS 6 | ||||
| /*
 | ||||
|  * Validates EC domain parameter data for known named curves. | ||||
|  * This can be used when a curve is loaded explicitly (without a curve | ||||
|  * name) or to validate that domain parameters have not been modified. | ||||
|  * | ||||
|  * Returns: The nid associated with the found named curve, or NID_undef | ||||
|  *          if not found. If there was an error it returns -1. | ||||
|  */ | ||||
| int ossl_ec_curve_nid_from_params(const EC_GROUP *group, BN_CTX *ctx) | ||||
| { | ||||
|     int ret = -1, nid, len, field_type, param_len; | ||||
|     size_t i, seed_len; | ||||
|     const unsigned char *seed, *params_seed, *params; | ||||
|     unsigned char *param_bytes = NULL; | ||||
|     const EC_CURVE_DATA *data; | ||||
|     const EC_POINT *generator = NULL; | ||||
|     const BIGNUM *cofactor = NULL; | ||||
|     /* An array of BIGNUMs for (p, a, b, x, y, order) */ | ||||
|     BIGNUM *bn[NUM_BN_FIELDS] = {NULL, NULL, NULL, NULL, NULL, NULL}; | ||||
| 
 | ||||
|     /* Use the optional named curve nid as a search field */ | ||||
|     nid = EC_GROUP_get_curve_name(group); | ||||
|     field_type = EC_GROUP_get_field_type(group); | ||||
|     seed_len = EC_GROUP_get_seed_len(group); | ||||
|     seed = EC_GROUP_get0_seed(group); | ||||
|     cofactor = EC_GROUP_get0_cofactor(group); | ||||
| 
 | ||||
|     BN_CTX_start(ctx); | ||||
| 
 | ||||
|     /*
 | ||||
|      * The built-in curves contains data fields (p, a, b, x, y, order) that are | ||||
|      * all zero-padded to be the same size. The size of the padding is | ||||
|      * determined by either the number of bytes in the field modulus (p) or the | ||||
|      * EC group order, whichever is larger. | ||||
|      */ | ||||
|     param_len = BN_num_bytes(group->order); | ||||
|     len = BN_num_bytes(group->field); | ||||
|     if (len > param_len) | ||||
|         param_len = len; | ||||
| 
 | ||||
|     /* Allocate space to store the padded data for (p, a, b, x, y, order)  */ | ||||
|     param_bytes = OPENSSL_malloc(param_len * NUM_BN_FIELDS); | ||||
|     if (param_bytes == NULL) | ||||
|         goto end; | ||||
| 
 | ||||
|     /* Create the bignums */ | ||||
|     for (i = 0; i < NUM_BN_FIELDS; ++i) { | ||||
|         if ((bn[i] = BN_CTX_get(ctx)) == NULL) | ||||
|             goto end; | ||||
|     } | ||||
|     /*
 | ||||
|      * Fill in the bn array with the same values as the internal curves | ||||
|      * i.e. the values are p, a, b, x, y, order. | ||||
|      */ | ||||
|     /* Get p, a & b */ | ||||
|     if (!(EC_GROUP_get_curve(group, bn[0], bn[1], bn[2], ctx) | ||||
|         && ((generator = EC_GROUP_get0_generator(group)) != NULL) | ||||
|         /* Get x & y */ | ||||
|         && EC_POINT_get_affine_coordinates(group, generator, bn[3], bn[4], ctx) | ||||
|         /* Get order */ | ||||
|         && EC_GROUP_get_order(group, bn[5], ctx))) | ||||
|         goto end; | ||||
| 
 | ||||
|    /*
 | ||||
|      * Convert the bignum array to bytes that are joined together to form | ||||
|      * a single buffer that contains data for all fields. | ||||
|      * (p, a, b, x, y, order) are all zero padded to be the same size. | ||||
|      */ | ||||
|     for (i = 0; i < NUM_BN_FIELDS; ++i) { | ||||
|         if (BN_bn2binpad(bn[i], ¶m_bytes[i*param_len], param_len) <= 0) | ||||
|             goto end; | ||||
|     } | ||||
| 
 | ||||
|     for (i = 0; i < curve_list_length; i++) { | ||||
|         const ec_list_element curve = curve_list[i]; | ||||
| 
 | ||||
|         data = curve.data; | ||||
|         /* Get the raw order byte data */ | ||||
|         params_seed = (const unsigned char *)(data + 1); /* skip header */ | ||||
|         params = params_seed + data->seed_len; | ||||
| 
 | ||||
|         /* Look for unique fields in the fixed curve data */ | ||||
|         if (data->field_type == field_type | ||||
|             && param_len == data->param_len | ||||
|             && (nid <= 0 || nid == curve.nid) | ||||
|             /* check the optional cofactor (ignore if its zero) */ | ||||
|             && (BN_is_zero(cofactor) | ||||
|                 || BN_is_word(cofactor, (const BN_ULONG)curve.data->cofactor)) | ||||
|             /* Check the optional seed (ignore if its not set) */ | ||||
|             && (data->seed_len == 0 || seed_len == 0 | ||||
|                 || ((size_t)data->seed_len == seed_len | ||||
|                      && memcmp(params_seed, seed, seed_len) == 0)) | ||||
|             /* Check that the groups params match the built-in curve params */ | ||||
|             && memcmp(param_bytes, params, param_len * NUM_BN_FIELDS) | ||||
|                              == 0) { | ||||
|             ret = curve.nid; | ||||
|             goto end; | ||||
|         } | ||||
|     } | ||||
|     /* Gets here if the group was not found */ | ||||
|     ret = NID_undef; | ||||
| end: | ||||
|     OPENSSL_free(param_bytes); | ||||
|     BN_CTX_end(ctx); | ||||
|     return ret; | ||||
| } | ||||
							
								
								
									
										2311
									
								
								SOURCES/ectest.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2311
									
								
								SOURCES/ectest.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										26
									
								
								SOURCES/genpatches
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										26
									
								
								SOURCES/genpatches
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,26 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| if [ $# -ne 2 ] ; then | ||||
|     echo "Usage:" | ||||
|     echo "   $0 <git-dir> <base-tag>" | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| git_dir="$1" | ||||
| base_tag="$2" | ||||
| 
 | ||||
| target_dir="$(pwd)" | ||||
| 
 | ||||
| pushd "$git_dir" >/dev/null | ||||
| git format-patch -k -o "$target_dir" "$base_tag" >/dev/null | ||||
| popd >/dev/null | ||||
| 
 | ||||
| echo "# Patches exported from source git" | ||||
| 
 | ||||
| i=1 | ||||
| for p in *.patch ; do | ||||
|     printf "# " | ||||
|     sed '/^Subject:/{s/^Subject: //;p};d' "$p" | ||||
|     printf "Patch%s: %s\n" $i "$p" | ||||
|     i=$(($i + 1)) | ||||
| done | ||||
							
								
								
									
										40
									
								
								SOURCES/hobble-openssl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								SOURCES/hobble-openssl
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,40 @@ | ||||
| #!/bin/sh | ||||
| 
 | ||||
| # Quit out if anything fails. | ||||
| set -e | ||||
| 
 | ||||
| # Clean out patent-or-otherwise-encumbered code. | ||||
| # MDC-2: 4,908,861 13/03/2007 - expired, we do not remove it but do not enable it anyway | ||||
| # IDEA:  5,214,703 07/01/2012 - expired, we do not remove it anymore | ||||
| # RC5:   5,724,428 01/11/2015 - expired, we do not remove it anymore | ||||
| # EC:    ????????? ??/??/2020 | ||||
| # SRP:   ????????? ??/??/2017 - expired, we do not remove it anymore | ||||
| 
 | ||||
| # Remove assembler portions of IDEA, MDC2, and RC5. | ||||
| # (find crypto/rc5/asm -type f | xargs -r rm -fv) | ||||
| 
 | ||||
| for c in `find crypto/bn -name "*gf2m.c"`; do | ||||
| 	echo Destroying $c | ||||
| 	> $c | ||||
| done | ||||
| 
 | ||||
| for c in `find crypto/ec -name "ec2*.c" -o -name "ec_curve.c"`; do | ||||
| 	echo Destroying $c | ||||
| 	> $c | ||||
| done | ||||
| 
 | ||||
| for c in `find test -name "ectest.c"`; do | ||||
| 	echo Destroying $c | ||||
| 	> $c | ||||
| done | ||||
| 
 | ||||
| for h in `find crypto ssl apps test -name "*.h"` ; do | ||||
| 	echo Removing EC2M references from $h | ||||
| 	cat $h | \ | ||||
| 	awk    'BEGIN {ech=1;} \ | ||||
| 		/^#[ \t]*ifndef.*NO_EC2M/ {ech--; next;} \ | ||||
|                 /^#[ \t]*if/ {if(ech < 1) ech--;} \ | ||||
| 		{if(ech>0) {;print $0};} \ | ||||
| 		/^#[ \t]*endif/ {if(ech < 1) ech++;}' > $h.hobbled && \ | ||||
| 	mv $h.hobbled $h | ||||
| done | ||||
							
								
								
									
										28
									
								
								SOURCES/make-dummy-cert
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										28
									
								
								SOURCES/make-dummy-cert
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,28 @@ | ||||
| #!/bin/sh | ||||
| umask 077 | ||||
| 
 | ||||
| answers() { | ||||
| 	echo -- | ||||
| 	echo SomeState | ||||
| 	echo SomeCity | ||||
| 	echo SomeOrganization | ||||
| 	echo SomeOrganizationalUnit | ||||
| 	echo localhost.localdomain | ||||
| 	echo root@localhost.localdomain | ||||
| } | ||||
| 
 | ||||
| if [ $# -eq 0 ] ; then | ||||
| 	echo $"Usage: `basename $0` filename [...]" | ||||
| 	exit 0 | ||||
| fi | ||||
| 
 | ||||
| for target in $@ ; do | ||||
| 	PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` | ||||
| 	PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` | ||||
| 	trap "rm -f $PEM1 $PEM2" SIGINT | ||||
| 	answers | /usr/bin/openssl req -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 2> /dev/null | ||||
| 	cat $PEM1 >  ${target} | ||||
| 	echo ""   >> ${target} | ||||
| 	cat $PEM2 >> ${target} | ||||
| 	rm -f $PEM1 $PEM2 | ||||
| done | ||||
							
								
								
									
										39
									
								
								SOURCES/renew-dummy-cert
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										39
									
								
								SOURCES/renew-dummy-cert
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,39 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| if [ $# -eq 0 ]; then | ||||
| 	echo $"Usage: `basename $0` filename" 1>&2 | ||||
| 	exit 1 | ||||
| fi | ||||
| 
 | ||||
| PEM=$1 | ||||
| REQ=`/bin/mktemp /tmp/openssl.XXXXXX` | ||||
| KEY=`/bin/mktemp /tmp/openssl.XXXXXX` | ||||
| CRT=`/bin/mktemp /tmp/openssl.XXXXXX` | ||||
| NEW=${PEM}_ | ||||
| 
 | ||||
| trap "rm -f $REQ $KEY $CRT $NEW" SIGINT | ||||
| 
 | ||||
| if [ ! -f $PEM ]; then | ||||
| 	echo "$PEM: file not found" 1>&2 | ||||
| 	exit 1 | ||||
| fi | ||||
| 
 | ||||
| umask 077 | ||||
| 
 | ||||
| OWNER=`ls -l $PEM | awk '{ printf "%s.%s", $3, $4; }'` | ||||
| 
 | ||||
| openssl rsa -inform pem -in $PEM -out $KEY | ||||
| openssl x509 -x509toreq -in $PEM -signkey $KEY -out $REQ | ||||
| openssl x509 -req -in $REQ -signkey $KEY -days 365 \ | ||||
| 	-extfile /etc/pki/tls/openssl.cnf -extensions v3_ca -out $CRT | ||||
| 
 | ||||
| (cat $KEY ; echo "" ; cat $CRT) > $NEW | ||||
| 
 | ||||
| chown $OWNER $NEW | ||||
| 
 | ||||
| mv -f $NEW $PEM | ||||
| 
 | ||||
| rm -f $REQ $KEY $CRT | ||||
| 
 | ||||
| exit 0 | ||||
| 
 | ||||
							
								
								
									
										632
									
								
								SPECS/openssl.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										632
									
								
								SPECS/openssl.spec
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,632 @@ | ||||
| # For the curious: | ||||
| # 0.9.8jk + EAP-FAST soversion = 8 | ||||
| # 1.0.0 soversion = 10 | ||||
| # 1.1.0 soversion = 1.1 (same as upstream although presence of some symbols | ||||
| #                        depends on build configuration options) | ||||
| # 3.0.0 soversion = 3 (same as upstream) | ||||
| %define soversion 3 | ||||
| 
 | ||||
| # Arches on which we need to prevent arch conflicts on opensslconf.h, must | ||||
| # also be handled in opensslconf-new.h. | ||||
| %define multilib_arches %{ix86} ia64 %{mips} ppc ppc64 s390 s390x sparcv9 sparc64 x86_64 | ||||
| 
 | ||||
| %global _performance_build 1 | ||||
| 
 | ||||
| Summary: Utilities from the general purpose cryptography library with TLS implementation | ||||
| Name: openssl | ||||
| Version: 3.0.1 | ||||
| Release: 20%{?dist} | ||||
| Epoch: 1 | ||||
| # We have to remove certain patented algorithms from the openssl source | ||||
| # tarball with the hobble-openssl script which is included below. | ||||
| # The original openssl upstream tarball cannot be shipped in the .src.rpm. | ||||
| Source: openssl-%{version}-hobbled.tar.xz | ||||
| Source1: hobble-openssl | ||||
| Source2: Makefile.certificate | ||||
| Source3: genpatches | ||||
| Source6: make-dummy-cert | ||||
| Source7: renew-dummy-cert | ||||
| Source9: configuration-switch.h | ||||
| Source10: configuration-prefix.h | ||||
| Source12: ec_curve.c | ||||
| Source13: ectest.c | ||||
| Source14: 0025-for-tests.patch | ||||
| 
 | ||||
| # Patches exported from source git | ||||
| # Aarch64 and ppc64le use lib64 | ||||
| Patch1: 0001-Aarch64-and-ppc64le-use-lib64.patch | ||||
| # Use more general default values in openssl.cnf | ||||
| Patch2: 0002-Use-more-general-default-values-in-openssl.cnf.patch | ||||
| # Do not install html docs | ||||
| Patch3: 0003-Do-not-install-html-docs.patch | ||||
| # Override default paths for the CA directory tree | ||||
| Patch4: 0004-Override-default-paths-for-the-CA-directory-tree.patch | ||||
| # apps/ca: fix md option help text | ||||
| Patch5: 0005-apps-ca-fix-md-option-help-text.patch | ||||
| # Disable signature verification with totally unsafe hash algorithms | ||||
| Patch6: 0006-Disable-signature-verification-with-totally-unsafe-h.patch | ||||
| # Add support for PROFILE=SYSTEM system default cipherlist | ||||
| Patch7: 0007-Add-support-for-PROFILE-SYSTEM-system-default-cipher.patch | ||||
| # Add FIPS_mode() compatibility macro | ||||
| Patch8: 0008-Add-FIPS_mode-compatibility-macro.patch | ||||
| # Add check to see if fips flag is enabled in kernel | ||||
| Patch9: 0009-Add-Kernel-FIPS-mode-flag-support.patch | ||||
| # remove unsupported EC curves | ||||
| Patch11: 0011-Remove-EC-curves.patch | ||||
| # Disable explicit EC curves | ||||
| # https://bugzilla.redhat.com/show_bug.cgi?id=1977867 | ||||
| Patch12: 0012-Disable-explicit-ec.patch | ||||
| # Instructions to load legacy provider in openssl.cnf | ||||
| Patch24: 0024-load-legacy-prov.patch | ||||
| # Tmp: test name change | ||||
| Patch31: 0031-tmp-Fix-test-names.patch | ||||
| # We load FIPS provider and set FIPS properties implicitly | ||||
| Patch32: 0032-Force-fips.patch | ||||
| # Embed HMAC into the fips.so | ||||
| Patch33: 0033-FIPS-embed-hmac.patch | ||||
| # Comment out fipsinstall command-line utility | ||||
| Patch34: 0034.fipsinstall_disable.patch | ||||
| # Skip unavailable algorithms running `openssl speed` | ||||
| Patch35: 0035-speed-skip-unavailable-dgst.patch | ||||
| # Minimize fips services | ||||
| Patch45: 0045-FIPS-services-minimize.patch | ||||
| # Backport of s390x hardening, https://github.com/openssl/openssl/pull/17486 | ||||
| Patch46: 0046-FIPS-s390x-hardening.patch | ||||
| # Execute KATS before HMAC verification | ||||
| Patch47: 0047-FIPS-early-KATS.patch | ||||
| # Backport of correctly handle 2^14 byte long records #17538 | ||||
| Patch48: 0048-correctly-handle-records.patch | ||||
| # Selectively disallow SHA1 signatures | ||||
| Patch49: 0049-Selectively-disallow-SHA1-signatures.patch | ||||
| # https://bugzilla.redhat.com/show_bug.cgi?id=2049265 | ||||
| Patch50: 0050-FIPS-enable-pkcs12-mac.patch | ||||
| # Backport of patch for RHEL for Edge rhbz #2027261 | ||||
| Patch51: 0051-Support-different-R_BITS-lengths-for-KBKDF.patch | ||||
| # Allow SHA1 in seclevel 2 if rh-allow-sha1-signatures = yes | ||||
| Patch52: 0052-Allow-SHA1-in-seclevel-2-if-rh-allow-sha1-signatures.patch | ||||
| # CVE 2022-0778 | ||||
| Patch53: 0053-CVE-2022-0778.patch | ||||
| 
 | ||||
| License: ASL 2.0 | ||||
| URL: http://www.openssl.org/ | ||||
| BuildRequires: gcc g++ | ||||
| BuildRequires: coreutils, perl-interpreter, sed, zlib-devel, /usr/bin/cmp | ||||
| BuildRequires: lksctp-tools-devel | ||||
| BuildRequires: /usr/bin/rename | ||||
| BuildRequires: /usr/bin/pod2man | ||||
| BuildRequires: /usr/sbin/sysctl | ||||
| BuildRequires: perl(Test::Harness), perl(Test::More), perl(Math::BigInt) | ||||
| BuildRequires: perl(Module::Load::Conditional), perl(File::Temp) | ||||
| BuildRequires: perl(Time::HiRes), perl(IPC::Cmd), perl(Pod::Html), perl(Digest::SHA) | ||||
| BuildRequires: perl(FindBin), perl(lib), perl(File::Compare), perl(File::Copy), perl(bigint) | ||||
| BuildRequires: git-core | ||||
| Requires: coreutils | ||||
| Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release} | ||||
| 
 | ||||
| %description | ||||
| The OpenSSL toolkit provides support for secure communications between | ||||
| machines. OpenSSL includes a certificate management tool and shared | ||||
| libraries which provide various cryptographic algorithms and | ||||
| protocols. | ||||
| 
 | ||||
| %package libs | ||||
| Summary: A general purpose cryptography library with TLS implementation | ||||
| Requires: ca-certificates >= 2008-5 | ||||
| Requires: crypto-policies >= 20180730 | ||||
| Recommends: openssl-pkcs11%{?_isa} | ||||
| 
 | ||||
| %description libs | ||||
| OpenSSL is a toolkit for supporting cryptography. The openssl-libs | ||||
| package contains the libraries that are used by various applications which | ||||
| support cryptographic algorithms and protocols. | ||||
| 
 | ||||
| %package devel | ||||
| Summary: Files for development of applications which will use OpenSSL | ||||
| Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release} | ||||
| Requires: pkgconfig | ||||
| 
 | ||||
| %description devel | ||||
| OpenSSL is a toolkit for supporting cryptography. The openssl-devel | ||||
| package contains include files needed to develop applications which | ||||
| support various cryptographic algorithms and protocols. | ||||
| 
 | ||||
| %package perl | ||||
| Summary: Perl scripts provided with OpenSSL | ||||
| Requires: perl-interpreter | ||||
| Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} | ||||
| 
 | ||||
| %description perl | ||||
| OpenSSL is a toolkit for supporting cryptography. The openssl-perl | ||||
| package provides Perl scripts for converting certificates and keys | ||||
| from other formats to the formats used by the OpenSSL toolkit. | ||||
| 
 | ||||
| %prep | ||||
| %autosetup -S git -n %{name}-%{version} | ||||
| 
 | ||||
| # The hobble_openssl is called here redundantly, just to be sure. | ||||
| # The tarball has already the sources removed. | ||||
| %{SOURCE1} > /dev/null | ||||
| 
 | ||||
| cp %{SOURCE12} crypto/ec/ | ||||
| cp %{SOURCE13} test/ | ||||
| 
 | ||||
| %build | ||||
| # Figure out which flags we want to use. | ||||
| # default | ||||
| sslarch=%{_os}-%{_target_cpu} | ||||
| %ifarch %ix86 | ||||
| sslarch=linux-elf | ||||
| if ! echo %{_target} | grep -q i686 ; then | ||||
| 	sslflags="no-asm 386" | ||||
| fi | ||||
| %endif | ||||
| %ifarch x86_64 | ||||
| sslflags=enable-ec_nistp_64_gcc_128 | ||||
| %endif | ||||
| %ifarch sparcv9 | ||||
| sslarch=linux-sparcv9 | ||||
| sslflags=no-asm | ||||
| %endif | ||||
| %ifarch sparc64 | ||||
| sslarch=linux64-sparcv9 | ||||
| sslflags=no-asm | ||||
| %endif | ||||
| %ifarch alpha alphaev56 alphaev6 alphaev67 | ||||
| sslarch=linux-alpha-gcc | ||||
| %endif | ||||
| %ifarch s390 sh3eb sh4eb | ||||
| sslarch="linux-generic32 -DB_ENDIAN" | ||||
| %endif | ||||
| %ifarch s390x | ||||
| sslarch="linux64-s390x" | ||||
| %endif | ||||
| %ifarch %{arm} | ||||
| sslarch=linux-armv4 | ||||
| %endif | ||||
| %ifarch aarch64 | ||||
| sslarch=linux-aarch64 | ||||
| sslflags=enable-ec_nistp_64_gcc_128 | ||||
| %endif | ||||
| %ifarch sh3 sh4 | ||||
| sslarch=linux-generic32 | ||||
| %endif | ||||
| %ifarch ppc64 ppc64p7 | ||||
| sslarch=linux-ppc64 | ||||
| %endif | ||||
| %ifarch ppc64le | ||||
| sslarch="linux-ppc64le" | ||||
| sslflags=enable-ec_nistp_64_gcc_128 | ||||
| %endif | ||||
| %ifarch mips mipsel | ||||
| sslarch="linux-mips32 -mips32r2" | ||||
| %endif | ||||
| %ifarch mips64 mips64el | ||||
| sslarch="linux64-mips64 -mips64r2" | ||||
| %endif | ||||
| %ifarch mips64el | ||||
| sslflags=enable-ec_nistp_64_gcc_128 | ||||
| %endif | ||||
| %ifarch riscv64 | ||||
| sslarch=linux-generic64 | ||||
| %endif | ||||
| 
 | ||||
| # Add -Wa,--noexecstack here so that libcrypto's assembler modules will be | ||||
| # marked as not requiring an executable stack. | ||||
| # Also add -DPURIFY to make using valgrind with openssl easier as we do not | ||||
| # want to depend on the uninitialized memory as a source of entropy anyway. | ||||
| RPM_OPT_FLAGS="$RPM_OPT_FLAGS -Wa,--noexecstack -Wa,--generate-missing-build-notes=yes -DPURIFY $RPM_LD_FLAGS" | ||||
| 
 | ||||
| export HASHBANGPERL=/usr/bin/perl | ||||
| 
 | ||||
| %define fips %{version}-%(date +%Y%m%d) | ||||
| # ia64, x86_64, ppc are OK by default | ||||
| # Configure the build tree.  Override OpenSSL defaults with known-good defaults | ||||
| # usable on all platforms.  The Configure script already knows to use -fPIC and | ||||
| # RPM_OPT_FLAGS, so we can skip specifiying them here. | ||||
| ./Configure \ | ||||
| 	--prefix=%{_prefix} --openssldir=%{_sysconfdir}/pki/tls ${sslflags} \ | ||||
| 	--system-ciphers-file=%{_sysconfdir}/crypto-policies/back-ends/openssl.config \ | ||||
| 	zlib enable-camellia enable-seed enable-rfc3779 enable-sctp \ | ||||
| 	enable-cms enable-md2 enable-rc5 enable-ktls enable-fips\ | ||||
| 	no-mdc2 no-ec2m no-sm2 no-sm4 enable-buildtest-c++\ | ||||
| 	shared  ${sslarch} $RPM_OPT_FLAGS '-DDEVRANDOM="\"/dev/urandom\"" -DREDHAT_FIPS_VERSION="\"%{fips}\""' | ||||
| 
 | ||||
| # Do not run this in a production package the FIPS symbols must be patched-in | ||||
| #util/mkdef.pl crypto update | ||||
| 
 | ||||
| make %{?_smp_mflags} all | ||||
| 
 | ||||
| # Clean up the .pc files | ||||
| for i in libcrypto.pc libssl.pc openssl.pc ; do | ||||
|   sed -i '/^Libs.private:/{s/-L[^ ]* //;s/-Wl[^ ]* //}' $i | ||||
| done | ||||
| 
 | ||||
| %check | ||||
| # Verify that what was compiled actually works. | ||||
| 
 | ||||
| # Hack - either enable SCTP AUTH chunks in kernel or disable sctp for check | ||||
| (sysctl net.sctp.addip_enable=1 && sysctl net.sctp.auth_enable=1) || \ | ||||
| (echo 'Failed to enable SCTP AUTH chunks, disabling SCTP for tests...' && | ||||
|  sed '/"msan" => "default",/a\ \ "sctp" => "default",' configdata.pm > configdata.pm.new && \ | ||||
|  touch -r configdata.pm configdata.pm.new && \ | ||||
|  mv -f configdata.pm.new configdata.pm) | ||||
| 
 | ||||
| # We must revert patch4 before tests otherwise they will fail | ||||
| patch -p1 -R < %{PATCH4} | ||||
| #We must disable default provider before tests otherwise they will fail | ||||
| patch -p1 < %{SOURCE14} | ||||
| 
 | ||||
| OPENSSL_ENABLE_MD5_VERIFY= | ||||
| export OPENSSL_ENABLE_MD5_VERIFY | ||||
| OPENSSL_ENABLE_SHA1_SIGNATURES= | ||||
| export OPENSSL_ENABLE_SHA1_SIGNATURES | ||||
| OPENSSL_SYSTEM_CIPHERS_OVERRIDE=xyz_nonexistent_file | ||||
| export OPENSSL_SYSTEM_CIPHERS_OVERRIDE | ||||
| #embed HMAC into fips provider for test run | ||||
| LD_LIBRARY_PATH=. apps/openssl dgst -binary -sha256 -mac HMAC -macopt hexkey:f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813 < providers/fips.so > providers/fips.so.hmac | ||||
| objcopy --update-section .rodata1=providers/fips.so.hmac providers/fips.so providers/fips.so.mac | ||||
| mv providers/fips.so.mac providers/fips.so | ||||
| #run tests itself | ||||
| make test HARNESS_JOBS=8 | ||||
| 
 | ||||
| # Add generation of HMAC checksum of the final stripped library | ||||
| # We manually copy standard definition of __spec_install_post | ||||
| # and add hmac calculation/embedding to fips.so | ||||
| %define __spec_install_post \ | ||||
|     %{?__debug_package:%{__debug_install_post}} \ | ||||
|     %{__arch_install_post} \ | ||||
|     %{__os_install_post} \ | ||||
|     LD_LIBRARY_PATH=. apps/openssl dgst -binary -sha256 -mac HMAC -macopt hexkey:f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813 < $RPM_BUILD_ROOT%{_libdir}/ossl-modules/fips.so > $RPM_BUILD_ROOT%{_libdir}/ossl-modules/fips.so.hmac \ | ||||
|     objcopy --update-section .rodata1=$RPM_BUILD_ROOT%{_libdir}/ossl-modules/fips.so.hmac $RPM_BUILD_ROOT%{_libdir}/ossl-modules/fips.so $RPM_BUILD_ROOT%{_libdir}/ossl-modules/fips.so.mac \ | ||||
|     mv $RPM_BUILD_ROOT%{_libdir}/ossl-modules/fips.so.mac $RPM_BUILD_ROOT%{_libdir}/ossl-modules/fips.so \ | ||||
|     rm $RPM_BUILD_ROOT%{_libdir}/ossl-modules/fips.so.hmac \ | ||||
| %{nil} | ||||
| 
 | ||||
| %define __provides_exclude_from %{_libdir}/openssl | ||||
| 
 | ||||
| %install | ||||
| [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT | ||||
| # Install OpenSSL. | ||||
| install -d $RPM_BUILD_ROOT{%{_bindir},%{_includedir},%{_libdir},%{_mandir},%{_libdir}/openssl,%{_pkgdocdir}} | ||||
| %make_install | ||||
| rename so.%{soversion} so.%{version} $RPM_BUILD_ROOT%{_libdir}/*.so.%{soversion} | ||||
| for lib in $RPM_BUILD_ROOT%{_libdir}/*.so.%{version} ; do | ||||
| 	chmod 755 ${lib} | ||||
| 	ln -s -f `basename ${lib}` $RPM_BUILD_ROOT%{_libdir}/`basename ${lib} .%{version}` | ||||
| 	ln -s -f `basename ${lib}` $RPM_BUILD_ROOT%{_libdir}/`basename ${lib} .%{version}`.%{soversion} | ||||
| done | ||||
| 
 | ||||
| # Remove static libraries | ||||
| for lib in $RPM_BUILD_ROOT%{_libdir}/*.a ; do | ||||
| 	rm -f ${lib} | ||||
| done | ||||
| 
 | ||||
| # Install a makefile for generating keys and self-signed certs, and a script | ||||
| # for generating them on the fly. | ||||
| mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/certs | ||||
| install -m644 %{SOURCE2} $RPM_BUILD_ROOT%{_pkgdocdir}/Makefile.certificate | ||||
| install -m755 %{SOURCE6} $RPM_BUILD_ROOT%{_bindir}/make-dummy-cert | ||||
| install -m755 %{SOURCE7} $RPM_BUILD_ROOT%{_bindir}/renew-dummy-cert | ||||
| 
 | ||||
| # Move runable perl scripts to bindir | ||||
| mv $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/misc/*.pl $RPM_BUILD_ROOT%{_bindir} | ||||
| mv $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/misc/tsget $RPM_BUILD_ROOT%{_bindir} | ||||
| 
 | ||||
| # Rename man pages so that they don't conflict with other system man pages. | ||||
| pushd $RPM_BUILD_ROOT%{_mandir} | ||||
| mv man5/config.5ossl man5/openssl.cnf.5 | ||||
| popd | ||||
| 
 | ||||
| mkdir -m755 $RPM_BUILD_ROOT%{_sysconfdir}/pki/CA | ||||
| mkdir -m700 $RPM_BUILD_ROOT%{_sysconfdir}/pki/CA/private | ||||
| mkdir -m755 $RPM_BUILD_ROOT%{_sysconfdir}/pki/CA/certs | ||||
| mkdir -m755 $RPM_BUILD_ROOT%{_sysconfdir}/pki/CA/crl | ||||
| mkdir -m755 $RPM_BUILD_ROOT%{_sysconfdir}/pki/CA/newcerts | ||||
| 
 | ||||
| # Ensure the config file timestamps are identical across builds to avoid | ||||
| # mulitlib conflicts and unnecessary renames on upgrade | ||||
| touch -r %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/openssl.cnf | ||||
| touch -r %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/ct_log_list.cnf | ||||
| 
 | ||||
| rm -f $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/openssl.cnf.dist | ||||
| rm -f $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/ct_log_list.cnf.dist | ||||
| #we don't use native fipsmodule.cnf because FIPS module is loaded automatically | ||||
| rm -f $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/fipsmodule.cnf | ||||
| 
 | ||||
| # Determine which arch opensslconf.h is going to try to #include. | ||||
| basearch=%{_arch} | ||||
| %ifarch %{ix86} | ||||
| basearch=i386 | ||||
| %endif | ||||
| %ifarch sparcv9 | ||||
| basearch=sparc | ||||
| %endif | ||||
| %ifarch sparc64 | ||||
| basearch=sparc64 | ||||
| %endif | ||||
| 
 | ||||
| # Next step of gradual disablement of SSL3. | ||||
| # Make SSL3 disappear to newly built dependencies. | ||||
| sed -i '/^\#ifndef OPENSSL_NO_SSL_TRACE/i\ | ||||
| #ifndef OPENSSL_NO_SSL3\ | ||||
| # define OPENSSL_NO_SSL3\ | ||||
| #endif' $RPM_BUILD_ROOT/%{_prefix}/include/openssl/opensslconf.h | ||||
| 
 | ||||
| %ifarch %{multilib_arches} | ||||
| # Do an configuration.h switcheroo to avoid file conflicts on systems where you | ||||
| # can have both a 32- and 64-bit version of the library, and they each need | ||||
| # their own correct-but-different versions of opensslconf.h to be usable. | ||||
| install -m644 %{SOURCE10} \ | ||||
| 	$RPM_BUILD_ROOT/%{_prefix}/include/openssl/configuration-${basearch}.h | ||||
| cat $RPM_BUILD_ROOT/%{_prefix}/include/openssl/configuration.h >> \ | ||||
| 	$RPM_BUILD_ROOT/%{_prefix}/include/openssl/configuration-${basearch}.h | ||||
| install -m644 %{SOURCE9} \ | ||||
| 	$RPM_BUILD_ROOT/%{_prefix}/include/openssl/configuration.h | ||||
| %endif | ||||
| 
 | ||||
| %files | ||||
| %{!?_licensedir:%global license %%doc} | ||||
| %license LICENSE.txt | ||||
| %doc NEWS.md README.md | ||||
| %{_bindir}/make-dummy-cert | ||||
| %{_bindir}/renew-dummy-cert | ||||
| %{_bindir}/openssl | ||||
| %{_mandir}/man1/* | ||||
| %{_mandir}/man5/* | ||||
| %{_mandir}/man7/* | ||||
| %{_pkgdocdir}/Makefile.certificate | ||||
| %exclude %{_mandir}/man1/*.pl* | ||||
| %exclude %{_mandir}/man1/tsget* | ||||
| 
 | ||||
| %files libs | ||||
| %{!?_licensedir:%global license %%doc} | ||||
| %license LICENSE.txt | ||||
| %dir %{_sysconfdir}/pki/tls | ||||
| %dir %{_sysconfdir}/pki/tls/certs | ||||
| %dir %{_sysconfdir}/pki/tls/misc | ||||
| %dir %{_sysconfdir}/pki/tls/private | ||||
| %config(noreplace) %{_sysconfdir}/pki/tls/openssl.cnf | ||||
| %config(noreplace) %{_sysconfdir}/pki/tls/ct_log_list.cnf | ||||
| %attr(0755,root,root) %{_libdir}/libcrypto.so.%{version} | ||||
| %{_libdir}/libcrypto.so.%{soversion} | ||||
| %attr(0755,root,root) %{_libdir}/libssl.so.%{version} | ||||
| %{_libdir}/libssl.so.%{soversion} | ||||
| %attr(0755,root,root) %{_libdir}/engines-%{soversion} | ||||
| %attr(0755,root,root) %{_libdir}/ossl-modules | ||||
| 
 | ||||
| %files devel | ||||
| %doc CHANGES.md doc/dir-locals.example.el doc/openssl-c-indent.el | ||||
| %{_prefix}/include/openssl | ||||
| %{_libdir}/*.so | ||||
| %{_mandir}/man3/* | ||||
| %{_libdir}/pkgconfig/*.pc | ||||
| 
 | ||||
| %files perl | ||||
| %{_bindir}/c_rehash | ||||
| %{_bindir}/*.pl | ||||
| %{_bindir}/tsget | ||||
| %{_mandir}/man1/*.pl* | ||||
| %{_mandir}/man1/tsget* | ||||
| %dir %{_sysconfdir}/pki/CA | ||||
| %dir %{_sysconfdir}/pki/CA/private | ||||
| %dir %{_sysconfdir}/pki/CA/certs | ||||
| %dir %{_sysconfdir}/pki/CA/crl | ||||
| %dir %{_sysconfdir}/pki/CA/newcerts | ||||
| 
 | ||||
| %ldconfig_scriptlets libs | ||||
| 
 | ||||
| %changelog | ||||
| * Fri Mar 18 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-20 | ||||
| - Fix acceptance of SHA-1 certificates with rh-allow-sha1-signatures = yes when | ||||
|   no OpenSSL library context is set | ||||
| - Resolves: rhbz#2063306 | ||||
| 
 | ||||
| * Fri Mar 18 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-19 | ||||
| - Fix TLS connections with SHA1 signatures if rh-allow-sha1-signatures = yes | ||||
| - Resolves: rhbz#2063306 | ||||
| 
 | ||||
| * Wed Mar 16 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-18 | ||||
| - CVE-2022-0778 fix | ||||
| - Resolves: rhbz#2062314 | ||||
| 
 | ||||
| * Thu Mar 10 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-15.1 | ||||
| - Fix invocation of EVP_PKEY_CTX_set_rsa_padding(RSA_PKCS1_PSS_PADDING) before | ||||
|   setting an allowed digest with EVP_PKEY_CTX_set_signature_md() | ||||
| - Resolves: rhbz#2061607 | ||||
| 
 | ||||
| * Tue Mar 01 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-14.1 | ||||
| - Allow SHA1 in SECLEVEL 2 if rh-allow-sha1-signatures = yes | ||||
| - Resolves: rhbz#2031742 | ||||
| 
 | ||||
| * Fri Feb 25 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-14 | ||||
| - Prevent use of SHA1 with ECDSA | ||||
| - Resolves: rhbz#2031742 | ||||
| 
 | ||||
| * Fri Feb 25 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-13 | ||||
| - OpenSSL will generate keys with prime192v1 curve if it is provided using explicit parameters | ||||
| - Resolves: rhbz#1977867 | ||||
| 
 | ||||
| * Thu Feb 24 2022 Peter Robinson <pbrobinson@fedoraproject.org> - 1:3.0.1-12 | ||||
| - Support KBKDF (NIST SP800-108) with an R value of 8bits | ||||
| - Resolves: rhbz#2027261 | ||||
| 
 | ||||
| * Wed Feb 23 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-11 | ||||
| - Allow SHA1 usage in MGF1 for RSASSA-PSS signatures | ||||
| - Resolves: rhbz#2031742 | ||||
| 
 | ||||
| * Wed Feb 23 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-10 | ||||
| - rebuilt | ||||
| 
 | ||||
| * Tue Feb 22 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-9 | ||||
| - Allow SHA1 usage in HMAC in TLS | ||||
| - Resolves: rhbz#2031742 | ||||
| 
 | ||||
| * Tue Feb 22 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-8 | ||||
| - OpenSSL will generate keys with prime192v1 curve if it is provided using explicit parameters | ||||
| - Resolves: rhbz#1977867 | ||||
| - pkcs12 export broken in FIPS mode | ||||
| - Resolves: rhbz#2049265 | ||||
| 
 | ||||
| * Tue Feb 22 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-8 | ||||
| - Disable SHA1 signature creation and verification by default | ||||
| - Set rh-allow-sha1-signatures = yes to re-enable | ||||
| - Resolves: rhbz#2031742 | ||||
| 
 | ||||
| * Thu Feb 03 2022 Sahana Prasad <sahana@redhat.com> - 1:3.0.1-7 | ||||
| - s_server: correctly handle 2^14 byte long records | ||||
| - Resolves: rhbz#2042011 | ||||
| 
 | ||||
| * Tue Feb 01 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-6 | ||||
| - Adjust FIPS provider version | ||||
| - Related: rhbz#2026445 | ||||
| 
 | ||||
| * Wed Jan 26 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-5 | ||||
| - On the s390x, zeroize all the copies of TLS premaster secret | ||||
| - Related: rhbz#2040448 | ||||
| 
 | ||||
| * Fri Jan 21 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-4 | ||||
| - rebuilt | ||||
| 
 | ||||
| * Fri Jan 21 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-3 | ||||
| - KATS tests should be executed before HMAC verification | ||||
| - Restoring fips=yes for SHA1 | ||||
| - Related: rhbz#2026445, rhbz#2041994 | ||||
| 
 | ||||
| * Thu Jan 20 2022 Sahana Prasad <sahana@redhat.com> - 1:3.0.1-2 | ||||
| - Add enable-buildtest-c++ to the configure options. | ||||
| - Related: rhbz#1990814 | ||||
| 
 | ||||
| * Tue Jan 18 2022 Sahana Prasad <sahana@redhat.com> - 1:3.0.1-1 | ||||
| - Rebase to upstream version 3.0.1 | ||||
| - Fixes CVE-2021-4044 Invalid handling of X509_verify_cert() internal errors in libssl | ||||
| - Resolves: rhbz#2038910, rhbz#2035148 | ||||
| 
 | ||||
| * Mon Jan 17 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.0-7 | ||||
| - Remove algorithms we don't plan to certify from fips module | ||||
| - Remove native fipsmodule.cnf | ||||
| - Related: rhbz#2026445 | ||||
| 
 | ||||
| * Tue Dec 21 2021 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.0-6 | ||||
| - openssl speed should run in FIPS mode | ||||
| - Related: rhbz#1977318 | ||||
| 
 | ||||
| * Wed Nov 24 2021 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.0-5 | ||||
| - rebuilt for spec cleanup | ||||
| - Related: rhbz#1985362 | ||||
| 
 | ||||
| * Thu Nov 18 2021 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.0-4 | ||||
| - Embed FIPS HMAC in fips.so | ||||
| - Enforce loading FIPS provider when FIPS kernel flag is on | ||||
| - Related: rhbz#1985362 | ||||
| 
 | ||||
| * Thu Oct 07 2021 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.0-3 | ||||
| - Fix memory leak in s_client | ||||
| - Related: rhbz#1996092 | ||||
| 
 | ||||
| * Mon Sep 20 2021 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.0-2 | ||||
| - Avoid double-free on error seeding the RNG. | ||||
| - KTLS and FIPS may interfere, so tests need to be tuned | ||||
| - Resolves: rhbz#1952844, rhbz#1961643 | ||||
| 
 | ||||
| * Thu Sep 09 2021 Sahana Prasad <sahana@redhat.com> - 1:3.0.0-1 | ||||
| - Rebase to upstream version 3.0.0 | ||||
| - Related: rhbz#1990814 | ||||
| 
 | ||||
| * Wed Aug 25 2021 Sahana Prasad <sahana@redhat.com> - 1:3.0.0-0.beta2.7 | ||||
| - Removes the dual-abi build as it not required anymore. The mass rebuild | ||||
|   was completed and all packages are rebuilt against Beta version. | ||||
| - Resolves: rhbz#1984097 | ||||
| 
 | ||||
| * Mon Aug 23 2021 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.0-0.beta2.6 | ||||
| - Correctly process CMS reading from /dev/stdin | ||||
| - Resolves: rhbz#1986315 | ||||
| 
 | ||||
| * Mon Aug 16 2021 Sahana Prasad <sahana@redhat.com> - 3.0.0-0.beta2.5 | ||||
| - Add instruction for loading legacy provider in openssl.cnf | ||||
| - Resolves: rhbz#1975836 | ||||
| 
 | ||||
| * Mon Aug 16 2021 Sahana Prasad <sahana@redhat.com> - 3.0.0-0.beta2.4 | ||||
| - Adds support for IDEA encryption. | ||||
| - Resolves: rhbz#1990602 | ||||
| 
 | ||||
| * Tue Aug 10 2021 Sahana Prasad <sahana@redhat.com> - 3.0.0-0.beta2.3 | ||||
| - Fixes core dump in openssl req -modulus | ||||
| - Fixes 'openssl req' to not ask for password when non-encrypted private key | ||||
|   is used | ||||
| - cms: Do not try to check binary format on stdin and -rctform fix | ||||
| - Resolves: rhbz#1988137, rhbz#1988468, rhbz#1988137 | ||||
| 
 | ||||
| * Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 1:3.0.0-0.beta2.2.1 | ||||
| - Rebuilt for IMA sigs, glibc 2.34, aarch64 flags | ||||
|   Related: rhbz#1991688 | ||||
| 
 | ||||
| * Wed Aug 04 2021 Dmitry Belyavskiy <dbelyavs@redhat.com> - 3.0.0-0.beta2.2 | ||||
| - When signature_algorithm extension is omitted, use more relevant alerts | ||||
| - Resolves: rhbz#1965017 | ||||
| 
 | ||||
| * Tue Aug 03 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.beta2.1 | ||||
| - Rebase to upstream version beta2 | ||||
| - Related: rhbz#1903209 | ||||
| 
 | ||||
| * Thu Jul 22 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.beta1.5 | ||||
| - Prevents creation of duplicate cert entries in PKCS #12 files | ||||
| - Resolves: rhbz#1978670 | ||||
| 
 | ||||
| * Wed Jul 21 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.beta1.4 | ||||
| - NVR bump to update to OpenSSL 3.0 Beta1 | ||||
| 
 | ||||
| * Mon Jul 19 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.beta1.3 | ||||
| - Update patch dual-abi.patch to add the #define macros in implementation | ||||
|   files instead of public header files | ||||
| 
 | ||||
| * Wed Jul 14 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.beta1.2 | ||||
| - Removes unused patch dual-abi.patch | ||||
| 
 | ||||
| * Wed Jul 14 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.beta1.1 | ||||
| - Update to Beta1 version | ||||
| - Includes a patch to support dual-ABI, as Beta1 brekas ABI with alpha16 | ||||
| 
 | ||||
| * Tue Jul 06 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.alpha16.7 | ||||
| - Fixes override of openssl_conf in openssl.cnf | ||||
| - Use AI_ADDRCONFIG only when explicit host name is given | ||||
| - Temporarily remove fipsmodule.cnf for arch i686 | ||||
| - Fixes segmentation fault in BN_lebin2bn | ||||
| - Resolves: rhbz#1975847, rhbz#1976845, rhbz#1973477, rhbz#1975855 | ||||
| 
 | ||||
| * Fri Jul 02 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.alpha16.6 | ||||
| - Adds FIPS mode compatibility patch (sahana@redhat.com) | ||||
| - Related: rhbz#1977318 | ||||
| 
 | ||||
| * Fri Jul 02 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.alpha16.5 | ||||
| - Fixes system hang issue when booted in FIPS mode (sahana@redhat.com) | ||||
| - Temporarily disable downstream FIPS patches | ||||
| - Related: rhbz#1977318 | ||||
| 
 | ||||
| * Fri Jun 11 2021 Mohan Boddu <mboddu@redhat.com> 3.0.0-0.alpha16.4 | ||||
| - Speeding up building openssl (dbelyavs@redhat.com) | ||||
|   Resolves: rhbz#1903209 | ||||
| 
 | ||||
| * Fri Jun 04 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.alpha16.3 | ||||
| - Fix reading SPKAC data from stdin | ||||
| - Fix incorrect OSSL_PKEY_PARAM_MAX_SIZE for ed25519 and ed448 | ||||
| - Return 0 after cleanup in OPENSSL_init_crypto() | ||||
| - Cleanup the peer point formats on regotiation | ||||
| - Fix default digest to SHA256 | ||||
| 
 | ||||
| * Thu May 27 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.alpha16.2 | ||||
| - Enable FIPS via config options | ||||
| 
 | ||||
| * Mon May 17 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.alpha16.1 | ||||
| - Update to alpha 16 version | ||||
|   Resolves: rhbz#1952901 openssl sends alert after orderly connection close | ||||
| 
 | ||||
| * Mon Apr 26 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.alpha15.1 | ||||
| - Update to alpha 15 version | ||||
|   Resolves: rhbz#1903209, rhbz#1952598,  | ||||
| 
 | ||||
| * Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 1:3.0.0-0.alpha13.1.1 | ||||
| - Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 | ||||
| 
 | ||||
| * Fri Apr 09 2021 Sahana Prasad <sahana@redhat.com> 3.0.0-0.alpha13.1 | ||||
| - Update to new major release OpenSSL 3.0.0 alpha 13 | ||||
|   Resolves: rhbz#1903209 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user