forked from rpms/kernel
		
	kernel-6.6.0-0.rc7.20231024gitd88520ad73b7.55
* Tue Oct 24 2023 Fedora Kernel Team <kernel-team@fedoraproject.org> [6.6.0-0.rc7.d88520ad73b7.55] - redhat: remove pending-rhel CONFIG_XFS_ASSERT_FATAL file (Patrick Talbert) - New configs in fs/xfs (Fedora Kernel Team) - crypto: rng - Override drivers/char/random in FIPS mode (Herbert Xu) - random: Add hook to override device reads and getrandom(2) (Herbert Xu) - Linux v6.6.0-0.rc7.d88520ad73b7 Resolves: Signed-off-by: Justin M. Forbes <jforbes@fedoraproject.org>
This commit is contained in:
		
							parent
							
								
									ff61ab282e
								
							
						
					
					
						commit
						34b9a6b2d0
					
				| @ -12,7 +12,7 @@ RHEL_MINOR = 99 | ||||
| #
 | ||||
| # Use this spot to avoid future merge conflicts.
 | ||||
| # Do not trim this comment.
 | ||||
| RHEL_RELEASE = 54 | ||||
| RHEL_RELEASE = 55 | ||||
| 
 | ||||
| #
 | ||||
| # RHEL_REBASE_NUM
 | ||||
|  | ||||
| @ -1,3 +1,9 @@ | ||||
| "https://gitlab.com/cki-project/kernel-ark/-/commit"/1820b71069f04d9347e71caeb9fe49e095dd28ec | ||||
|  1820b71069f04d9347e71caeb9fe49e095dd28ec crypto: rng - Override drivers/char/random in FIPS mode | ||||
| 
 | ||||
| "https://gitlab.com/cki-project/kernel-ark/-/commit"/325cfb22f086df02e268cfbfa6ff96d89d0acd5d | ||||
|  325cfb22f086df02e268cfbfa6ff96d89d0acd5d random: Add hook to override device reads and getrandom(2) | ||||
| 
 | ||||
| "https://gitlab.com/cki-project/kernel-ark/-/commit"/8374deeb36ca291927f714ba4b78349fb3a6e3b1 | ||||
|  8374deeb36ca291927f714ba4b78349fb3a6e3b1 [redhat] kernel/rh_messages.c: move hardware tables to rh_messages.h | ||||
| 
 | ||||
|  | ||||
| @ -7855,7 +7855,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7830,7 +7830,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7851,7 +7851,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7826,7 +7826,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7907,7 +7907,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7882,7 +7882,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7330,7 +7330,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7307,7 +7307,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7315,7 +7315,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7292,7 +7292,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7315,7 +7315,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| # CONFIG_XFS_FS is not set | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7665,7 +7665,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7641,7 +7641,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7722,7 +7722,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
| @ -7698,7 +7698,6 @@ CONFIG_XFRM_SUB_POLICY=y | ||||
| # CONFIG_XFRM_USER_COMPAT is not set | ||||
| CONFIG_XFRM_USER=y | ||||
| CONFIG_XFRM=y | ||||
| CONFIG_XFS_ASSERT_FATAL=y | ||||
| # CONFIG_XFS_DEBUG is not set | ||||
| CONFIG_XFS_FS=m | ||||
| # CONFIG_XFS_ONLINE_REPAIR is not set | ||||
|  | ||||
							
								
								
									
										13
									
								
								kernel.spec
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								kernel.spec
									
									
									
									
									
								
							| @ -163,13 +163,13 @@ Summary: The Linux kernel | ||||
| %define specrpmversion 6.6.0 | ||||
| %define specversion 6.6.0 | ||||
| %define patchversion 6.6 | ||||
| %define pkgrelease 0.rc7.54 | ||||
| %define pkgrelease 0.rc7.20231024gitd88520ad73b7.55 | ||||
| %define kversion 6 | ||||
| %define tarfile_release 6.6-rc7 | ||||
| %define tarfile_release 6.6-rc7-18-gd88520ad73b7 | ||||
| # This is needed to do merge window version magic | ||||
| %define patchlevel 6 | ||||
| # This allows pkg_release to have configurable %%{?dist} tag | ||||
| %define specrelease 0.rc7.54%{?buildid}%{?dist} | ||||
| %define specrelease 0.rc7.20231024gitd88520ad73b7.55%{?buildid}%{?dist} | ||||
| # This defines the kabi tarball version | ||||
| %define kabiversion 6.6.0 | ||||
| 
 | ||||
| @ -3709,6 +3709,13 @@ fi\ | ||||
| # | ||||
| # | ||||
| %changelog | ||||
| * Tue Oct 24 2023 Fedora Kernel Team <kernel-team@fedoraproject.org> [6.6.0-0.rc7.d88520ad73b7.55] | ||||
| - redhat: remove pending-rhel CONFIG_XFS_ASSERT_FATAL file (Patrick Talbert) | ||||
| - New configs in fs/xfs (Fedora Kernel Team) | ||||
| - crypto: rng - Override drivers/char/random in FIPS mode (Herbert Xu) | ||||
| - random: Add hook to override device reads and getrandom(2) (Herbert Xu) | ||||
| - Linux v6.6.0-0.rc7.d88520ad73b7 | ||||
| 
 | ||||
| * Mon Oct 23 2023 Fedora Kernel Team <kernel-team@fedoraproject.org> [6.6.0-0.rc7.54] | ||||
| - Linux v6.6.0-0.rc7 | ||||
| 
 | ||||
|  | ||||
| @ -9,12 +9,15 @@ | ||||
|  arch/s390/kernel/setup.c                           |   4 + | ||||
|  arch/x86/kernel/cpu/common.c                       |   1 + | ||||
|  arch/x86/kernel/setup.c                            |  68 ++- | ||||
|  crypto/drbg.c                                      |  18 +- | ||||
|  crypto/rng.c                                       | 149 +++++- | ||||
|  drivers/acpi/apei/hest.c                           |   8 + | ||||
|  drivers/acpi/irq.c                                 |  17 +- | ||||
|  drivers/acpi/scan.c                                |   9 + | ||||
|  drivers/ata/libahci.c                              |  18 + | ||||
|  drivers/char/ipmi/ipmi_dmi.c                       |  15 + | ||||
|  drivers/char/ipmi/ipmi_msghandler.c                |  16 +- | ||||
|  drivers/char/random.c                              | 122 +++++ | ||||
|  drivers/firmware/efi/Makefile                      |   1 + | ||||
|  drivers/firmware/efi/efi.c                         | 124 +++-- | ||||
|  drivers/firmware/efi/secureboot.c                  |  38 ++ | ||||
| @ -41,12 +44,14 @@ | ||||
|  drivers/scsi/sd.c                                  |  10 + | ||||
|  drivers/usb/core/hub.c                             |   7 + | ||||
|  fs/afs/main.c                                      |   3 + | ||||
|  include/linux/crypto.h                             |   1 + | ||||
|  include/linux/efi.h                                |  22 +- | ||||
|  include/linux/kernel.h                             |  14 + | ||||
|  include/linux/lsm_hook_defs.h                      |   2 + | ||||
|  include/linux/module.h                             |   5 + | ||||
|  include/linux/panic.h                              |  18 +- | ||||
|  include/linux/pci.h                                |   5 + | ||||
|  include/linux/random.h                             |  10 + | ||||
|  include/linux/rh_kabi.h                            | 515 +++++++++++++++++++++ | ||||
|  include/linux/rmi.h                                |   1 + | ||||
|  include/linux/security.h                           |   5 + | ||||
| @ -64,7 +69,7 @@ | ||||
|  security/lockdown/Kconfig                          |  13 + | ||||
|  security/lockdown/lockdown.c                       |   1 + | ||||
|  security/security.c                                |  12 + | ||||
|  66 files changed, 1779 insertions(+), 188 deletions(-) | ||||
|  71 files changed, 2060 insertions(+), 207 deletions(-) | ||||
| 
 | ||||
| diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
 | ||||
| index 0a1731a0f0ef..7015d8d057a0 100644
 | ||||
| @ -359,6 +364,280 @@ index b098b1fa2470..6b936d786590 100644 | ||||
|  	unwind_init(); | ||||
|  } | ||||
|   | ||||
| diff --git a/crypto/drbg.c b/crypto/drbg.c
 | ||||
| index ff4ebbc68efa..2410034cca4f 100644
 | ||||
| --- a/crypto/drbg.c
 | ||||
| +++ b/crypto/drbg.c
 | ||||
| @@ -1510,13 +1510,14 @@ static int drbg_generate(struct drbg_state *drbg,
 | ||||
|   * Wrapper around drbg_generate which can pull arbitrary long strings | ||||
|   * from the DRBG without hitting the maximum request limitation. | ||||
|   * | ||||
| - * Parameters: see drbg_generate
 | ||||
| + * Parameters: see drbg_generate, except @reseed, which triggers reseeding
 | ||||
|   * Return codes: see drbg_generate -- if one drbg_generate request fails, | ||||
|   *		 the entire drbg_generate_long request fails | ||||
|   */ | ||||
|  static int drbg_generate_long(struct drbg_state *drbg, | ||||
|  			      unsigned char *buf, unsigned int buflen, | ||||
| -			      struct drbg_string *addtl)
 | ||||
| +			      struct drbg_string *addtl,
 | ||||
| +			      bool reseed)
 | ||||
|  { | ||||
|  	unsigned int len = 0; | ||||
|  	unsigned int slice = 0; | ||||
| @@ -1526,6 +1527,8 @@ static int drbg_generate_long(struct drbg_state *drbg,
 | ||||
|  		slice = ((buflen - len) / drbg_max_request_bytes(drbg)); | ||||
|  		chunk = slice ? drbg_max_request_bytes(drbg) : (buflen - len); | ||||
|  		mutex_lock(&drbg->drbg_mutex); | ||||
| +		if (reseed)
 | ||||
| +			drbg->seeded = DRBG_SEED_STATE_UNSEEDED;
 | ||||
|  		err = drbg_generate(drbg, buf + len, chunk, addtl); | ||||
|  		mutex_unlock(&drbg->drbg_mutex); | ||||
|  		if (0 > err) | ||||
| @@ -1952,6 +1955,7 @@ static int drbg_kcapi_random(struct crypto_rng *tfm,
 | ||||
|  	struct drbg_state *drbg = crypto_rng_ctx(tfm); | ||||
|  	struct drbg_string *addtl = NULL; | ||||
|  	struct drbg_string string; | ||||
| +	int err;
 | ||||
|   | ||||
|  	if (slen) { | ||||
|  		/* linked list variable is now local to allow modification */ | ||||
| @@ -1959,7 +1963,15 @@ static int drbg_kcapi_random(struct crypto_rng *tfm,
 | ||||
|  		addtl = &string; | ||||
|  	} | ||||
|   | ||||
| -	return drbg_generate_long(drbg, dst, dlen, addtl);
 | ||||
| +	err = drbg_generate_long(drbg, dst, dlen, addtl,
 | ||||
| +				 (crypto_tfm_get_flags(crypto_rng_tfm(tfm)) &
 | ||||
| +				  CRYPTO_TFM_REQ_NEED_RESEED) ==
 | ||||
| +				 CRYPTO_TFM_REQ_NEED_RESEED);
 | ||||
| +
 | ||||
| +	crypto_tfm_clear_flags(crypto_rng_tfm(tfm),
 | ||||
| +			       CRYPTO_TFM_REQ_NEED_RESEED);
 | ||||
| +
 | ||||
| +	return err;
 | ||||
|  } | ||||
|   | ||||
|  /* | ||||
| diff --git a/crypto/rng.c b/crypto/rng.c
 | ||||
| index 279dffdebf59..d24dd37205cd 100644
 | ||||
| --- a/crypto/rng.c
 | ||||
| +++ b/crypto/rng.c
 | ||||
| @@ -12,10 +12,13 @@
 | ||||
|  #include <linux/atomic.h> | ||||
|  #include <linux/cryptouser.h> | ||||
|  #include <linux/err.h> | ||||
| +#include <linux/fips.h>
 | ||||
|  #include <linux/kernel.h> | ||||
|  #include <linux/module.h> | ||||
|  #include <linux/mutex.h> | ||||
|  #include <linux/random.h> | ||||
| +#include <linux/sched.h>
 | ||||
| +#include <linux/sched/signal.h>
 | ||||
|  #include <linux/seq_file.h> | ||||
|  #include <linux/slab.h> | ||||
|  #include <linux/string.h> | ||||
| @@ -23,7 +26,9 @@
 | ||||
|   | ||||
|  #include "internal.h" | ||||
|   | ||||
| -static DEFINE_MUTEX(crypto_default_rng_lock);
 | ||||
| +static ____cacheline_aligned_in_smp DEFINE_MUTEX(crypto_reseed_rng_lock);
 | ||||
| +static struct crypto_rng *crypto_reseed_rng;
 | ||||
| +static ____cacheline_aligned_in_smp DEFINE_MUTEX(crypto_default_rng_lock);
 | ||||
|  struct crypto_rng *crypto_default_rng; | ||||
|  EXPORT_SYMBOL_GPL(crypto_default_rng); | ||||
|  static int crypto_default_rng_refcnt; | ||||
| @@ -136,31 +141,37 @@ struct crypto_rng *crypto_alloc_rng(const char *alg_name, u32 type, u32 mask)
 | ||||
|  } | ||||
|  EXPORT_SYMBOL_GPL(crypto_alloc_rng); | ||||
|   | ||||
| -int crypto_get_default_rng(void)
 | ||||
| +static int crypto_get_rng(struct crypto_rng **rngp)
 | ||||
|  { | ||||
|  	struct crypto_rng *rng; | ||||
|  	int err; | ||||
|   | ||||
| -	mutex_lock(&crypto_default_rng_lock);
 | ||||
| -	if (!crypto_default_rng) {
 | ||||
| +	if (!*rngp) {
 | ||||
|  		rng = crypto_alloc_rng("stdrng", 0, 0); | ||||
|  		err = PTR_ERR(rng); | ||||
|  		if (IS_ERR(rng)) | ||||
| -			goto unlock;
 | ||||
| +			return err;
 | ||||
|   | ||||
|  		err = crypto_rng_reset(rng, NULL, crypto_rng_seedsize(rng)); | ||||
|  		if (err) { | ||||
|  			crypto_free_rng(rng); | ||||
| -			goto unlock;
 | ||||
| +			return err;
 | ||||
|  		} | ||||
|   | ||||
| -		crypto_default_rng = rng;
 | ||||
| +		*rngp = rng;
 | ||||
|  	} | ||||
|   | ||||
| -	crypto_default_rng_refcnt++;
 | ||||
| -	err = 0;
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +int crypto_get_default_rng(void)
 | ||||
| +{
 | ||||
| +	int err;
 | ||||
|   | ||||
| -unlock:
 | ||||
| +	mutex_lock(&crypto_default_rng_lock);
 | ||||
| +	err = crypto_get_rng(&crypto_default_rng);
 | ||||
| +	if (!err)
 | ||||
| +		crypto_default_rng_refcnt++;
 | ||||
|  	mutex_unlock(&crypto_default_rng_lock); | ||||
|   | ||||
|  	return err; | ||||
| @@ -176,24 +187,33 @@ void crypto_put_default_rng(void)
 | ||||
|  EXPORT_SYMBOL_GPL(crypto_put_default_rng); | ||||
|   | ||||
|  #if defined(CONFIG_CRYPTO_RNG) || defined(CONFIG_CRYPTO_RNG_MODULE) | ||||
| -int crypto_del_default_rng(void)
 | ||||
| +static int crypto_del_rng(struct crypto_rng **rngp, int *refcntp,
 | ||||
| +		      struct mutex *lock)
 | ||||
|  { | ||||
|  	int err = -EBUSY; | ||||
|   | ||||
| -	mutex_lock(&crypto_default_rng_lock);
 | ||||
| -	if (crypto_default_rng_refcnt)
 | ||||
| +	mutex_lock(lock);
 | ||||
| +	if (refcntp && *refcntp)
 | ||||
|  		goto out; | ||||
|   | ||||
| -	crypto_free_rng(crypto_default_rng);
 | ||||
| -	crypto_default_rng = NULL;
 | ||||
| +	crypto_free_rng(*rngp);
 | ||||
| +	*rngp = NULL;
 | ||||
|   | ||||
|  	err = 0; | ||||
|   | ||||
|  out: | ||||
| -	mutex_unlock(&crypto_default_rng_lock);
 | ||||
| +	mutex_unlock(lock);
 | ||||
|   | ||||
|  	return err; | ||||
|  } | ||||
| +
 | ||||
| +int crypto_del_default_rng(void)
 | ||||
| +{
 | ||||
| +	return crypto_del_rng(&crypto_default_rng, &crypto_default_rng_refcnt,
 | ||||
| +			      &crypto_default_rng_lock) ?:
 | ||||
| +	       crypto_del_rng(&crypto_reseed_rng, NULL,
 | ||||
| +			      &crypto_reseed_rng_lock);
 | ||||
| +}
 | ||||
|  EXPORT_SYMBOL_GPL(crypto_del_default_rng); | ||||
|  #endif | ||||
|   | ||||
| @@ -251,5 +271,102 @@ void crypto_unregister_rngs(struct rng_alg *algs, int count)
 | ||||
|  } | ||||
|  EXPORT_SYMBOL_GPL(crypto_unregister_rngs); | ||||
|   | ||||
| +static ssize_t crypto_devrandom_read_iter(struct iov_iter *iter, bool reseed)
 | ||||
| +{
 | ||||
| +	struct crypto_rng *rng;
 | ||||
| +	u8 tmp[256];
 | ||||
| +	ssize_t ret;
 | ||||
| +
 | ||||
| +	if (unlikely(!iov_iter_count(iter)))
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
| +	if (reseed) {
 | ||||
| +		u32 flags = 0;
 | ||||
| +
 | ||||
| +		/* If reseeding is requested, acquire a lock on
 | ||||
| +		 * crypto_reseed_rng so it is not swapped out until
 | ||||
| +		 * the initial random bytes are generated.
 | ||||
| +		 *
 | ||||
| +		 * The algorithm implementation is also protected with
 | ||||
| +		 * a separate mutex (drbg->drbg_mutex) around the
 | ||||
| +		 * reseed-and-generate operation.
 | ||||
| +		 */
 | ||||
| +		mutex_lock(&crypto_reseed_rng_lock);
 | ||||
| +
 | ||||
| +		/* If crypto_default_rng is not set, it will be seeded
 | ||||
| +		 * at creation in __crypto_get_default_rng and thus no
 | ||||
| +		 * reseeding is needed.
 | ||||
| +		 */
 | ||||
| +		if (crypto_reseed_rng)
 | ||||
| +			flags |= CRYPTO_TFM_REQ_NEED_RESEED;
 | ||||
| +
 | ||||
| +		ret = crypto_get_rng(&crypto_reseed_rng);
 | ||||
| +		if (ret) {
 | ||||
| +			mutex_unlock(&crypto_reseed_rng_lock);
 | ||||
| +			return ret;
 | ||||
| +		}
 | ||||
| +
 | ||||
| +		rng = crypto_reseed_rng;
 | ||||
| +		crypto_tfm_set_flags(crypto_rng_tfm(rng), flags);
 | ||||
| +	} else {
 | ||||
| +		ret = crypto_get_default_rng();
 | ||||
| +		if (ret)
 | ||||
| +			return ret;
 | ||||
| +		rng = crypto_default_rng;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	for (;;) {
 | ||||
| +		size_t i, copied;
 | ||||
| +		int err;
 | ||||
| +
 | ||||
| +		i = min_t(size_t, iov_iter_count(iter), sizeof(tmp));
 | ||||
| +		err = crypto_rng_get_bytes(rng, tmp, i);
 | ||||
| +		if (err) {
 | ||||
| +			ret = err;
 | ||||
| +			break;
 | ||||
| +		}
 | ||||
| +
 | ||||
| +		copied = copy_to_iter(tmp, i, iter);
 | ||||
| +		ret += copied;
 | ||||
| +
 | ||||
| +		if (!iov_iter_count(iter))
 | ||||
| +			break;
 | ||||
| +
 | ||||
| +		if (need_resched()) {
 | ||||
| +			if (signal_pending(current))
 | ||||
| +				break;
 | ||||
| +			schedule();
 | ||||
| +		}
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	if (reseed)
 | ||||
| +		mutex_unlock(&crypto_reseed_rng_lock);
 | ||||
| +	else
 | ||||
| +		crypto_put_default_rng();
 | ||||
| +	memzero_explicit(tmp, sizeof(tmp));
 | ||||
| +
 | ||||
| +	return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static const struct random_extrng crypto_devrandom_rng = {
 | ||||
| +	.extrng_read_iter = crypto_devrandom_read_iter,
 | ||||
| +	.owner = THIS_MODULE,
 | ||||
| +};
 | ||||
| +
 | ||||
| +static int __init crypto_rng_init(void)
 | ||||
| +{
 | ||||
| +	if (fips_enabled)
 | ||||
| +		random_register_extrng(&crypto_devrandom_rng);
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void __exit crypto_rng_exit(void)
 | ||||
| +{
 | ||||
| +	random_unregister_extrng();
 | ||||
| +}
 | ||||
| +
 | ||||
| +late_initcall(crypto_rng_init);
 | ||||
| +module_exit(crypto_rng_exit);
 | ||||
| +
 | ||||
|  MODULE_LICENSE("GPL"); | ||||
|  MODULE_DESCRIPTION("Random Number Generator"); | ||||
| diff --git a/drivers/acpi/apei/hest.c b/drivers/acpi/apei/hest.c
 | ||||
| index 6aef1ee5e1bd..8f146b1b4972 100644
 | ||||
| --- a/drivers/acpi/apei/hest.c
 | ||||
| @ -531,6 +810,203 @@ index 186f1fee7534..93e3a76596ff 100644 | ||||
|  	mutex_lock(&ipmi_interfaces_mutex); | ||||
|  	rv = ipmi_register_driver(); | ||||
|  	mutex_unlock(&ipmi_interfaces_mutex); | ||||
| diff --git a/drivers/char/random.c b/drivers/char/random.c
 | ||||
| index 3cb37760dfec..20aa9f3b8b48 100644
 | ||||
| --- a/drivers/char/random.c
 | ||||
| +++ b/drivers/char/random.c
 | ||||
| @@ -51,6 +51,7 @@
 | ||||
|  #include <linux/completion.h> | ||||
|  #include <linux/uuid.h> | ||||
|  #include <linux/uaccess.h> | ||||
| +#include <linux/rcupdate.h>
 | ||||
|  #include <linux/suspend.h> | ||||
|  #include <linux/siphash.h> | ||||
|  #include <linux/sched/isolation.h> | ||||
| @@ -309,6 +310,11 @@ static void crng_fast_key_erasure(u8 key[CHACHA_KEY_SIZE],
 | ||||
|  	memzero_explicit(first_block, sizeof(first_block)); | ||||
|  } | ||||
|   | ||||
| +/*
 | ||||
| + * Hook for external RNG.
 | ||||
| + */
 | ||||
| +static const struct random_extrng __rcu *extrng;
 | ||||
| +
 | ||||
|  /* | ||||
|   * This function returns a ChaCha state that you may use for generating | ||||
|   * random data. It also returns up to 32 bytes on its own of random data | ||||
| @@ -739,6 +745,9 @@ static void __cold _credit_init_bits(size_t bits)
 | ||||
|  } | ||||
|   | ||||
|   | ||||
| +static const struct file_operations extrng_random_fops;
 | ||||
| +static const struct file_operations extrng_urandom_fops;
 | ||||
| +
 | ||||
|  /********************************************************************** | ||||
|   * | ||||
|   * Entropy collection routines. | ||||
| @@ -956,6 +965,19 @@ void __init add_bootloader_randomness(const void *buf, size_t len)
 | ||||
|  		credit_init_bits(len * 8); | ||||
|  } | ||||
|   | ||||
| +void random_register_extrng(const struct random_extrng *rng)
 | ||||
| +{
 | ||||
| +	rcu_assign_pointer(extrng, rng);
 | ||||
| +}
 | ||||
| +EXPORT_SYMBOL_GPL(random_register_extrng);
 | ||||
| +
 | ||||
| +void random_unregister_extrng(void)
 | ||||
| +{
 | ||||
| +	RCU_INIT_POINTER(extrng, NULL);
 | ||||
| +	synchronize_rcu();
 | ||||
| +}
 | ||||
| +EXPORT_SYMBOL_GPL(random_unregister_extrng);
 | ||||
| +
 | ||||
|  #if IS_ENABLED(CONFIG_VMGENID) | ||||
|  static BLOCKING_NOTIFIER_HEAD(vmfork_chain); | ||||
|   | ||||
| @@ -1366,6 +1388,7 @@ SYSCALL_DEFINE3(getrandom, char __user *, ubuf, size_t, len, unsigned int, flags
 | ||||
|  	struct iov_iter iter; | ||||
|  	struct iovec iov; | ||||
|  	int ret; | ||||
| +	const struct random_extrng *rng;
 | ||||
|   | ||||
|  	if (flags & ~(GRND_NONBLOCK | GRND_RANDOM | GRND_INSECURE)) | ||||
|  		return -EINVAL; | ||||
| @@ -1377,6 +1400,21 @@ SYSCALL_DEFINE3(getrandom, char __user *, ubuf, size_t, len, unsigned int, flags
 | ||||
|  	if ((flags & (GRND_INSECURE | GRND_RANDOM)) == (GRND_INSECURE | GRND_RANDOM)) | ||||
|  		return -EINVAL; | ||||
|   | ||||
| +	rcu_read_lock();
 | ||||
| +	rng = rcu_dereference(extrng);
 | ||||
| +	if (rng && !try_module_get(rng->owner))
 | ||||
| +		rng = NULL;
 | ||||
| +	rcu_read_unlock();
 | ||||
| +
 | ||||
| +	if (rng) {
 | ||||
| +		ret = import_single_range(ITER_DEST, ubuf, len, &iov, &iter);
 | ||||
| +		if (unlikely(ret))
 | ||||
| +			return ret;
 | ||||
| +		ret = rng->extrng_read_iter(&iter, !!(flags & GRND_RANDOM));
 | ||||
| +		module_put(rng->owner);
 | ||||
| +		return ret;
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	if (!crng_ready() && !(flags & GRND_INSECURE)) { | ||||
|  		if (flags & GRND_NONBLOCK) | ||||
|  			return -EAGAIN; | ||||
| @@ -1397,6 +1435,12 @@ static __poll_t random_poll(struct file *file, poll_table *wait)
 | ||||
|  	return crng_ready() ? EPOLLIN | EPOLLRDNORM : EPOLLOUT | EPOLLWRNORM; | ||||
|  } | ||||
|   | ||||
| +static __poll_t extrng_poll(struct file *file, poll_table * wait)
 | ||||
| +{
 | ||||
| +	/* extrng pool is always full, always read, no writes */
 | ||||
| +	return EPOLLIN | EPOLLRDNORM;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static ssize_t write_pool_user(struct iov_iter *iter) | ||||
|  { | ||||
|  	u8 block[BLAKE2S_BLOCK_SIZE]; | ||||
| @@ -1538,7 +1582,58 @@ static int random_fasync(int fd, struct file *filp, int on)
 | ||||
|  	return fasync_helper(fd, filp, on, &fasync); | ||||
|  } | ||||
|   | ||||
| +static int random_open(struct inode *inode, struct file *filp)
 | ||||
| +{
 | ||||
| +	const struct random_extrng *rng;
 | ||||
| +
 | ||||
| +	rcu_read_lock();
 | ||||
| +	rng = rcu_dereference(extrng);
 | ||||
| +	if (rng && !try_module_get(rng->owner))
 | ||||
| +		rng = NULL;
 | ||||
| +	rcu_read_unlock();
 | ||||
| +
 | ||||
| +	if (!rng)
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
| +	filp->f_op = &extrng_random_fops;
 | ||||
| +	filp->private_data = rng->owner;
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int urandom_open(struct inode *inode, struct file *filp)
 | ||||
| +{
 | ||||
| +	const struct random_extrng *rng;
 | ||||
| +
 | ||||
| +	rcu_read_lock();
 | ||||
| +	rng = rcu_dereference(extrng);
 | ||||
| +	if (rng && !try_module_get(rng->owner))
 | ||||
| +		rng = NULL;
 | ||||
| +	rcu_read_unlock();
 | ||||
| +
 | ||||
| +	if (!rng)
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
| +	filp->f_op = &extrng_urandom_fops;
 | ||||
| +	filp->private_data = rng->owner;
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int extrng_release(struct inode *inode, struct file *filp)
 | ||||
| +{
 | ||||
| +	module_put(filp->private_data);
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static ssize_t
 | ||||
| +extrng_read_iter(struct kiocb *kiocb, struct iov_iter *iter)
 | ||||
| +{
 | ||||
| +	return rcu_dereference_raw(extrng)->extrng_read_iter(iter, false);
 | ||||
| +}
 | ||||
| +
 | ||||
|  const struct file_operations random_fops = { | ||||
| +	.open  = random_open,
 | ||||
|  	.read_iter = random_read_iter, | ||||
|  	.write_iter = random_write_iter, | ||||
|  	.poll = random_poll, | ||||
| @@ -1551,6 +1646,7 @@ const struct file_operations random_fops = {
 | ||||
|  }; | ||||
|   | ||||
|  const struct file_operations urandom_fops = { | ||||
| +	.open  = urandom_open,
 | ||||
|  	.read_iter = urandom_read_iter, | ||||
|  	.write_iter = random_write_iter, | ||||
|  	.unlocked_ioctl = random_ioctl, | ||||
| @@ -1561,6 +1657,32 @@ const struct file_operations urandom_fops = {
 | ||||
|  	.splice_write = iter_file_splice_write, | ||||
|  }; | ||||
|   | ||||
| +static const struct file_operations extrng_random_fops = {
 | ||||
| +	.open  = random_open,
 | ||||
| +	.read_iter  = extrng_read_iter,
 | ||||
| +	.write_iter = random_write_iter,
 | ||||
| +	.poll  = extrng_poll,
 | ||||
| +	.unlocked_ioctl = random_ioctl,
 | ||||
| +	.compat_ioctl = compat_ptr_ioctl,
 | ||||
| +	.fasync = random_fasync,
 | ||||
| +	.llseek = noop_llseek,
 | ||||
| +	.release = extrng_release,
 | ||||
| +	.splice_read = copy_splice_read,
 | ||||
| +	.splice_write = iter_file_splice_write,
 | ||||
| +};
 | ||||
| +
 | ||||
| +static const struct file_operations extrng_urandom_fops = {
 | ||||
| +	.open  = urandom_open,
 | ||||
| +	.read_iter  = extrng_read_iter,
 | ||||
| +	.write_iter = random_write_iter,
 | ||||
| +	.unlocked_ioctl = random_ioctl,
 | ||||
| +	.compat_ioctl = compat_ptr_ioctl,
 | ||||
| +	.fasync = random_fasync,
 | ||||
| +	.llseek = noop_llseek,
 | ||||
| +	.release = extrng_release,
 | ||||
| +	.splice_read = copy_splice_read,
 | ||||
| +	.splice_write = iter_file_splice_write,
 | ||||
| +};
 | ||||
|   | ||||
|  /******************************************************************** | ||||
|   * | ||||
| diff --git a/drivers/firmware/efi/Makefile b/drivers/firmware/efi/Makefile
 | ||||
| index e489fefd23da..f2dfae764fb5 100644
 | ||||
| --- a/drivers/firmware/efi/Makefile
 | ||||
| @ -1704,6 +2180,18 @@ index eae288c8d40a..8b8bf447cedc 100644 | ||||
|  	return ret; | ||||
|   | ||||
|  error_proc: | ||||
| diff --git a/include/linux/crypto.h b/include/linux/crypto.h
 | ||||
| index 31f6fee0c36c..b099200de233 100644
 | ||||
| --- a/include/linux/crypto.h
 | ||||
| +++ b/include/linux/crypto.h
 | ||||
| @@ -135,6 +135,7 @@
 | ||||
|  #define CRYPTO_TFM_REQ_FORBID_WEAK_KEYS	0x00000100 | ||||
|  #define CRYPTO_TFM_REQ_MAY_SLEEP	0x00000200 | ||||
|  #define CRYPTO_TFM_REQ_MAY_BACKLOG	0x00000400 | ||||
| +#define CRYPTO_TFM_REQ_NEED_RESEED	0x00000800
 | ||||
|   | ||||
|  /* | ||||
|   * Miscellaneous stuff. | ||||
| diff --git a/include/linux/efi.h b/include/linux/efi.h
 | ||||
| index 80b21d1c6eaf..b66c0683f2fc 100644
 | ||||
| --- a/include/linux/efi.h
 | ||||
| @ -1881,6 +2369,34 @@ index 8c7c2c3c6c65..ee66c86fc538 100644 | ||||
|  #if defined(CONFIG_PCIEPORTBUS) || defined(CONFIG_EEH) | ||||
|  void pci_uevent_ers(struct pci_dev *pdev, enum  pci_ers_result err_type); | ||||
|  #endif | ||||
| diff --git a/include/linux/random.h b/include/linux/random.h
 | ||||
| index b0a940af4fff..8a52424fd0d5 100644
 | ||||
| --- a/include/linux/random.h
 | ||||
| +++ b/include/linux/random.h
 | ||||
| @@ -9,6 +9,13 @@
 | ||||
|   | ||||
|  #include <uapi/linux/random.h> | ||||
|   | ||||
| +struct iov_iter;
 | ||||
| +
 | ||||
| +struct random_extrng {
 | ||||
| +	ssize_t (*extrng_read_iter)(struct iov_iter *iter, bool reseed);
 | ||||
| +	struct module *owner;
 | ||||
| +};
 | ||||
| +
 | ||||
|  struct notifier_block; | ||||
|   | ||||
|  void add_device_randomness(const void *buf, size_t len); | ||||
| @@ -157,6 +164,9 @@ int random_prepare_cpu(unsigned int cpu);
 | ||||
|  int random_online_cpu(unsigned int cpu); | ||||
|  #endif | ||||
|   | ||||
| +void random_register_extrng(const struct random_extrng *rng);
 | ||||
| +void random_unregister_extrng(void);
 | ||||
| +
 | ||||
|  #ifndef MODULE | ||||
|  extern const struct file_operations random_fops, urandom_fops; | ||||
|  #endif | ||||
| diff --git a/include/linux/rh_kabi.h b/include/linux/rh_kabi.h
 | ||||
| new file mode 100644 | ||||
| index 000000000000..c7b42c1f1681
 | ||||
|  | ||||
							
								
								
									
										6
									
								
								sources
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								sources
									
									
									
									
									
								
							| @ -1,3 +1,3 @@ | ||||
| SHA512 (linux-6.6-rc7.tar.xz) = c554605c021dc569a22d5479a0792f5fc23a949a9fb76343ee3594b72514f2950611db69d4f1ab5a8d390ed979fd41a87aee080bbebf78c9cfc882e608ab63e3 | ||||
| SHA512 (kernel-abi-stablelists-6.6.0.tar.bz2) = 896b1b24617e3a6905c26dd2a50b23ff2e2c7627f6b6dc12b328d5f74109016722b4ba050c5051886cb597308a793366346a34d7ec82a658b646d5288b347ae7 | ||||
| SHA512 (kernel-kabi-dw-6.6.0.tar.bz2) = f98c14408c8434ecd253c6781c4f918cf1497da7bd55a79382fcf9dc67512d48e9357825c99a960616d2a9403d55be46989344cd201f762fd5450a2115e43c2a | ||||
| SHA512 (linux-6.6-rc7-18-gd88520ad73b7.tar.xz) = def0ee2feec1780c60049aa4fdb8d06fc16052a680712044750f0338af2a07d1c08e03db2fcae2163ea2196e935013740fee692fd72a82efa0bf83d24a8b248e | ||||
| SHA512 (kernel-abi-stablelists-6.6.0.tar.bz2) = e71711bc322fd6c936efc31ee25054dfc85e21dd7cdbecf151dcff39eadcd3ac32d769667957687d7816c733c824ef8d5d8af30a3bcf4725b28833194a926ec8 | ||||
| SHA512 (kernel-kabi-dw-6.6.0.tar.bz2) = 7ba67c6e5874e4336adfa4dbe459d27c256367e0355d77d4b02ca067ee3a65dd1876aa58b7c1d93c5a293d86b6041403f2aca9bfb58564ccd4b393cce468bbef | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user