All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Andy Lutomirski <luto@amacapital.net>,
	kvm@vger.kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
	"Theodore Ts'o" <tytso@mit.edu>,
	linux-kernel@vger.kernel.org, Kees Cook <keescook@chromium.org>,
	x86@kernel.org
Cc: Daniel Borkmann <dborkman@redhat.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Gleb Natapov <gleb@kernel.org>,
	bsd@redhat.com, Andrew Honig <ahonig@google.com>
Subject: Re: [PATCH v5 4/5] x86,random,kvm: Use KVM_GET_RNG_SEED in arch_get_rng_seed
Date: Thu, 31 Jul 2014 13:56:43 +0200	[thread overview]
Message-ID: <53DA2EFB.5050406@redhat.com> (raw)
In-Reply-To: <e43e49f9ca4a9696f9c72e16182266593bbc1379.1406177531.git.luto@amacapital.net>

Il 24/07/2014 06:57, Andy Lutomirski ha scritto:
> This is a straightforward implementation: for each bit of internal
> RNG state, request one bit from KVM_GET_RNG_SEED.  This is done even
> if RDSEED/RDRAND worked, since KVM_GET_RNG_SEED is likely to provide
> cryptographically secure output even if the CPU's RNG is weak or
> compromised.
> 
> Signed-off-by: Andy Lutomirski <luto@amacapital.net>
> ---
>  arch/x86/Kconfig                 |  4 ++++
>  arch/x86/include/asm/kvm_guest.h |  9 +++++++++
>  arch/x86/kernel/archrandom.c     | 25 ++++++++++++++++++++++++-
>  arch/x86/kernel/kvm.c            | 10 ++++++++++
>  4 files changed, 47 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index a8f749e..adfa09c 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -593,6 +593,7 @@ config KVM_GUEST
>  	bool "KVM Guest support (including kvmclock)"
>  	depends on PARAVIRT
>  	select PARAVIRT_CLOCK
> +	select ARCH_RANDOM
>  	default y
>  	---help---
>  	  This option enables various optimizations for running under the KVM
> @@ -1507,6 +1508,9 @@ config ARCH_RANDOM
>  	  If supported, this is a high bandwidth, cryptographically
>  	  secure hardware random number generator.
>  
> +	  This also enables paravirt RNGs such as KVM's if the relevant
> +	  PV guest support is enabled.
> +
>  config X86_SMAP
>  	def_bool y
>  	prompt "Supervisor Mode Access Prevention" if EXPERT
> diff --git a/arch/x86/include/asm/kvm_guest.h b/arch/x86/include/asm/kvm_guest.h
> index a92b176..8c4dbd5 100644
> --- a/arch/x86/include/asm/kvm_guest.h
> +++ b/arch/x86/include/asm/kvm_guest.h
> @@ -3,4 +3,13 @@
>  
>  int kvm_setup_vsyscall_timeinfo(void);
>  
> +#if defined(CONFIG_KVM_GUEST) && defined(CONFIG_ARCH_RANDOM)
> +extern bool kvm_get_rng_seed(u64 *rv);
> +#else
> +static inline bool kvm_get_rng_seed(u64 *rv)
> +{
> +	return false;
> +}
> +#endif
> +
>  #endif /* _ASM_X86_KVM_GUEST_H */
> diff --git a/arch/x86/kernel/archrandom.c b/arch/x86/kernel/archrandom.c
> index 47d13b0..8c8d021 100644
> --- a/arch/x86/kernel/archrandom.c
> +++ b/arch/x86/kernel/archrandom.c
> @@ -15,6 +15,7 @@
>   */
>  
>  #include <asm/archrandom.h>
> +#include <asm/kvm_guest.h>
>  
>  void arch_get_rng_seed(void *ctx,
>  		       void (*seed)(void *ctx, u32 data),
> @@ -22,7 +23,7 @@ void arch_get_rng_seed(void *ctx,
>  		       const char *log_prefix)
>  {
>  	int i;
> -	int rdseed_bits = 0, rdrand_bits = 0;
> +	int rdseed_bits = 0, rdrand_bits = 0, kvm_bits = 0;
>  	char buf[128] = "";
>  	char *msgptr = buf;
>  
> @@ -42,10 +43,32 @@ void arch_get_rng_seed(void *ctx,
>  #endif
>  	}
>  
> +	/*
> +	 * Use KVM_GET_RNG_SEED regardless of whether the CPU RNG
> +	 * worked, since it incorporates entropy unavailable to the CPU,
> +	 * and we shouldn't trust the hardware RNG more than we need to.
> +	 * We request enough bits for the entire internal RNG state,
> +	 * because there's no good reason not to.
> +	 */
> +	for (i = 0; i < bits_per_source; i += 64) {
> +		u64 rv;
> +
> +		if (kvm_get_rng_seed(&rv)) {
> +			seed(ctx, (u32)rv);
> +			seed(ctx, (u32)(rv >> 32));
> +			kvm_bits += 8 * sizeof(rv);
> +		} else {
> +			break;	/* If it fails once, it will keep failing. */
> +		}
> +	}
> +
>  	if (rdseed_bits)
>  		msgptr += sprintf(msgptr, ", %d bits from RDSEED", rdseed_bits);
>  	if (rdrand_bits)
>  		msgptr += sprintf(msgptr, ", %d bits from RDRAND", rdrand_bits);
> +	if (kvm_bits)
> +		msgptr += sprintf(msgptr, ", %d bits from KVM_GET_RNG_BITS",
> +				  kvm_bits);
>  	if (buf[0])
>  		pr_info("%s with %s\n", log_prefix, buf + 2);
>  }
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index 3dd8e2c..bd8783a 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -416,6 +416,16 @@ void kvm_disable_steal_time(void)
>  	wrmsr(MSR_KVM_STEAL_TIME, 0, 0);
>  }
>  
> +bool kvm_get_rng_seed(u64 *v)
> +{
> +	/*
> +	 * Allow migration from a hypervisor with the GET_RNG_SEED
> +	 * feature to a hypervisor without it.
> +	 */
> +	return (kvm_para_has_feature(KVM_FEATURE_GET_RNG_SEED) &&
> +		rdmsrl_safe(MSR_KVM_GET_RNG_SEED, v) == 0);
> +}
> +
>  #ifdef CONFIG_SMP
>  static void __init kvm_smp_prepare_boot_cpu(void)
>  {
> 

Acked-by: Paolo Bonzini <pbonzini@redhat.com>

  reply	other threads:[~2014-07-31 11:56 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-24  4:57 [PATCH v5 0/5] random,x86,kvm: Rework arch RNG seeds and get some from kvm Andy Lutomirski
2014-07-24  4:57 ` [PATCH v5 1/5] x86,kvm: Add MSR_KVM_GET_RNG_SEED and a matching feature bit Andy Lutomirski
2014-07-31 11:56   ` Paolo Bonzini
2014-07-24  4:57 ` [PATCH v5 2/5] random: Add and use arch_get_rng_seed Andy Lutomirski
2014-07-29 23:46   ` Andy Lutomirski
2014-08-04 22:25   ` Theodore Ts'o
2014-07-24  4:57 ` [PATCH v5 3/5] x86,random: Add an x86 implementation of arch_get_rng_seed Andy Lutomirski
2014-07-24  4:57 ` [PATCH v5 4/5] x86,random,kvm: Use KVM_GET_RNG_SEED in arch_get_rng_seed Andy Lutomirski
2014-07-31 11:56   ` Paolo Bonzini [this message]
2014-07-24  4:57 ` [PATCH v5 5/5] x86,kaslr: Use MSR_KVM_GET_RNG_SEED for KASLR if available Andy Lutomirski
2014-07-31 11:56   ` Paolo Bonzini
2014-08-12 19:11 ` [PATCH v5 0/5] random,x86,kvm: Rework arch RNG seeds and get some from kvm Andy Lutomirski
2014-08-12 19:17   ` Theodore Ts'o
2014-08-12 19:22     ` Andy Lutomirski
2014-08-13  7:48       ` H. Peter Anvin
2014-08-13  8:37         ` Andy Lutomirski
2014-08-13 14:32         ` Theodore Ts'o
2014-08-13 16:13           ` Andy Lutomirski
2014-08-13 17:45             ` H. Peter Anvin
2014-08-13 18:22               ` Theodore Ts'o
2014-08-13 18:33                 ` Andy Lutomirski
2014-08-13 18:44                   ` H. Peter Anvin
2014-08-14  2:41                     ` H. Peter Anvin
2014-08-14  5:14                       ` Andy Lutomirski
2014-08-17  8:44                   ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53DA2EFB.5050406@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=ahonig@google.com \
    --cc=bsd@redhat.com \
    --cc=dborkman@redhat.com \
    --cc=gleb@kernel.org \
    --cc=hpa@zytor.com \
    --cc=keescook@chromium.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=raghavendra.kt@linux.vnet.ibm.com \
    --cc=tytso@mit.edu \
    --cc=vatsa@linux.vnet.ibm.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.