From nobody Sat Feb 7 17:42:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 806BA13DB93; Wed, 14 Feb 2024 19:58:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707940684; cv=none; b=cvb55fey+6/3xCocpxfLbQ2sjy+uk22lAfwFtsvhn3MkPWR8tjscSNCX47dW5cMk58opnfDPuM6a1pDtJJsKakVpVHli4DqV5hK4Xsa2uLjuKcY7w1lqavoSSlZyNMjHizyvq769FGjZbeegAhxzG9Ov7xogbYm5D2NzE82DF1U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707940684; c=relaxed/simple; bh=rTKv1TDsFzL+RzB4KD1Ng3M4meMkWcKDfmVZOO+HcO0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ZyjDcdlvQB4tSNCtV17EnaDtx4QIuwzzSmpAeOLJv4HQf4/4At+kMded0D3li/foIivQwH56fHUj1KtnyVi0bMCUlijJ3me1esUTrMg0M87POOnsNTq1CfRGJUDr+3K+pMm3LGNruwgprZsg5QR82m5B5E3ZSojeS1xk10RO0K4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=zx2c4.com header.i=@zx2c4.com header.b=bAb38AmS; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=zx2c4.com header.i=@zx2c4.com header.b="bAb38AmS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CEBC6C433C7; Wed, 14 Feb 2024 19:58:02 +0000 (UTC) Authentication-Results: smtp.kernel.org; dkim=pass (1024-bit key) header.d=zx2c4.com header.i=@zx2c4.com header.b="bAb38AmS" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zx2c4.com; s=20210105; t=1707940681; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=usBdTDKhZdYOqvFmhLJXleA6TJU1AAI9ITba9p7Xy2A=; b=bAb38AmSl+1HLYBs2tbYWtbKGdv9rc3fEuKOzyVp0l7GFm/kfZx+r+PPndQPtqIXwI7cNI j61OF/Fd8BmYNgjSAkZSMMp4nf8hfN2aaib+LKY/lpjm0SOTTInPqsfck2j68ybarrZ0ft S8lroiEzKdWeQxtpE95tgCewvP2Y2Co= Received: by mail.zx2c4.com (ZX2C4 Mail Server) with ESMTPSA id a632d9c0 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Wed, 14 Feb 2024 19:58:01 +0000 (UTC) From: "Jason A. Donenfeld" To: x86@kernel.org, linux-coco@lists.linux.dev, linux-kernel@vger.kernel.org Cc: "Jason A. Donenfeld" , Borislav Petkov , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Dave Hansen , Elena Reshetova , "H . Peter Anvin" , Ingo Molnar , "Kirill A . Shutemov" , Theodore Ts'o , Thomas Gleixner Subject: [PATCH v2 1/2] x86/archrandom: WARN if RDRAND fails and don't retry Date: Wed, 14 Feb 2024 20:56:47 +0100 Message-ID: <20240214195744.8332-2-Jason@zx2c4.com> In-Reply-To: <20240214195744.8332-1-Jason@zx2c4.com> References: <20240214195744.8332-1-Jason@zx2c4.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable According to both Intel [1] and AMD [2], RDRAND will never fail unless the hardware is defective. The old advice to try 10 times is not considered correct. RDSEED is a different story. But with RDRAND never failing, WARN()ing when it does seems like a reasonable thing to do, as it's probably indicative of some deeper problem. [1] https://lore.kernel.org/all/DM8PR11MB57503A2BB6F74618D64CC44AE74E2@DM8P= R11MB5750.namprd11.prod.outlook.com/ [2] https://lore.kernel.org/all/20240209214530.GHZcac-vOym8k3IuJm@fat_crate= .local/ Cc: Borislav Petkov Cc: Daniel P. Berrang=C3=A9 Cc: Dave Hansen Cc: Elena Reshetova Cc: H. Peter Anvin Cc: Ingo Molnar Cc: Kirill A. Shutemov Cc: Theodore Ts'o Cc: Thomas Gleixner Signed-off-by: Jason A. Donenfeld --- arch/x86/include/asm/archrandom.h | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/arch/x86/include/asm/archrandom.h b/arch/x86/include/asm/archr= andom.h index 02bae8e0758b..1cc01ecd5e75 100644 --- a/arch/x86/include/asm/archrandom.h +++ b/arch/x86/include/asm/archrandom.h @@ -13,22 +13,18 @@ #include #include =20 -#define RDRAND_RETRY_LOOPS 10 - /* Unconditional execution of RDRAND and RDSEED */ =20 static inline bool __must_check rdrand_long(unsigned long *v) { bool ok; - unsigned int retry =3D RDRAND_RETRY_LOOPS; - do { - asm volatile("rdrand %[out]" - CC_SET(c) - : CC_OUT(c) (ok), [out] "=3Dr" (*v)); - if (ok) - return true; - } while (--retry); - return false; + asm volatile("rdrand %[out]" + CC_SET(c) + : CC_OUT(c) (ok), [out] "=3Dr" (*v)); +#ifndef KASLR_COMPRESSED_BOOT + WARN_ON(!ok); +#endif + return ok; } =20 static inline bool __must_check rdseed_long(unsigned long *v) --=20 2.43.0 From nobody Sat Feb 7 17:42:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CA6B213DB93; Wed, 14 Feb 2024 19:58:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707940687; cv=none; b=cIWaI6DWjAKIoCQoC7vc/NQS8W/R4Z872VMCY+LcaU1Or7DSQpVOnXPyttYaVeuhXaSeN2EI1BDo1PsieUWYYZ9B0uN5XtaDKzJBKJySxv6UVE4DhZVOxFC39vTKbmVIldfX6hOf/I/ymxdYqK/aBWIbxNjdW8bQzE7MSocfh1A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707940687; c=relaxed/simple; bh=RdJUsBuMV/uPcYgE4PVSnqiibsyibd9kyPg1rvF6p08=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=LVjSgPXLBe9p4173pzhapD+gEsNrONPJBo0fn17xNEh0Y9xJa/bxOz2JgKVLnptivlVLXT/I3YkxXJoXGLAjRGZAMnTqcXRMVDcg6/QcrgWoV/yrox0KjHegZDusD/rym9THJggwBwP6qn32fXNdyrXxwcz8QuoQjoDXDEhw40A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=zx2c4.com header.i=@zx2c4.com header.b=Hwl/fq/E; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=zx2c4.com header.i=@zx2c4.com header.b="Hwl/fq/E" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3CE22C433C7; Wed, 14 Feb 2024 19:58:06 +0000 (UTC) Authentication-Results: smtp.kernel.org; dkim=pass (1024-bit key) header.d=zx2c4.com header.i=@zx2c4.com header.b="Hwl/fq/E" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zx2c4.com; s=20210105; t=1707940685; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/TM0b2580+zFUa1NO2LoxorT2yqWyAQkC+kc3INL8zI=; b=Hwl/fq/EKFP4TJv6IRHTN0RkCfI8MX46bRjyQgz9fmAFXgtNKLV2jYZRq61tP8oZ7jWoj6 2Dpxo/LgkpnvPgknVx7/JAGG0tzpVbkg1kPCqKK1Eyz1jxz+F/udmtkDlbHXppOgXcwOVs 4Mt6PJWXqMTKXj2uUVH+iUuJxCjoYak= Received: by mail.zx2c4.com (ZX2C4 Mail Server) with ESMTPSA id c3aa5c10 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Wed, 14 Feb 2024 19:58:05 +0000 (UTC) From: "Jason A. Donenfeld" To: x86@kernel.org, linux-coco@lists.linux.dev, linux-kernel@vger.kernel.org Cc: "Jason A. Donenfeld" , Borislav Petkov , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Dave Hansen , Elena Reshetova , "H . Peter Anvin" , Ingo Molnar , "Kirill A . Shutemov" , Theodore Ts'o , Thomas Gleixner Subject: [PATCH v2 2/2] x86/coco: Require seeding RNG with RDRAND on CoCo systems Date: Wed, 14 Feb 2024 20:56:48 +0100 Message-ID: <20240214195744.8332-3-Jason@zx2c4.com> In-Reply-To: <20240214195744.8332-1-Jason@zx2c4.com> References: <20240214195744.8332-1-Jason@zx2c4.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable There are few uses of CoCo that don't rely on working cryptography and hence a working RNG. Unfortunately, the CoCo threat model means that the VM host cannot be trusted and may actively work against guests to extract secrets or manipulate computation. Since a malicious host can modify or observe nearly all inputs to guests, the only remaining source of entropy for CoCo guests is RDRAND. If RDRAND is broken -- due to CPU hardware fault -- the generic path will WARN(), but probably CoCo systems shouldn't even continue executing. This is mostly a concern at boot time when initially seeding the RNG, as after that the consequences of a broken RDRAND are much more theoretical. So, try at boot to seed the RNG using 256 bits of RDRAND output. If this fails, panic(). This will also trigger if the system is booted without RDRAND, as RDRAND is essential for a safe CoCo boot. This patch is deliberately written to be "just a CoCo x86 driver feature" and not part of the RNG itself. Many device drivers and platforms have some desire to contribute something to the RNG, and add_device_randomness() is specifically meant for this purpose. Any driver can call this with seed data of any quality, or even garbage quality, and it can only possibly make the quality of the RNG better or have no effect, but can never make it worse. Rather than trying to build something into the core of the RNG, this patch interprets the particular CoCo issue as just a CoCo issue, and therefore separates this all out into driver (well, arch/platform) code. Cc: Borislav Petkov Cc: Daniel P. Berrang=C3=A9 Cc: Dave Hansen Cc: Elena Reshetova Cc: H. Peter Anvin Cc: Ingo Molnar Cc: Kirill A. Shutemov Cc: Theodore Ts'o Cc: Thomas Gleixner Signed-off-by: Jason A. Donenfeld --- Changes v1->v2: - panic() instead of BUG_ON(), as suggested by Andi Kleen. - Update comments, now that we have info from AMD and Intel. arch/x86/coco/core.c | 36 ++++++++++++++++++++++++++++++++++++ arch/x86/include/asm/coco.h | 2 ++ arch/x86/kernel/setup.c | 2 ++ 3 files changed, 40 insertions(+) diff --git a/arch/x86/coco/core.c b/arch/x86/coco/core.c index eeec9986570e..34d7c6795e8c 100644 --- a/arch/x86/coco/core.c +++ b/arch/x86/coco/core.c @@ -3,13 +3,16 @@ * Confidential Computing Platform Capability checks * * Copyright (C) 2021 Advanced Micro Devices, Inc. + * Copyright (C) 2024 Jason A. Donenfeld . All Rights Res= erved. * * Author: Tom Lendacky */ =20 #include #include +#include =20 +#include #include #include =20 @@ -153,3 +156,36 @@ __init void cc_set_mask(u64 mask) { cc_mask =3D mask; } + +__init void cc_random_init(void) +{ + unsigned long rng_seed[32 / sizeof(long)]; + size_t i, longs; + + if (cc_vendor =3D=3D CC_VENDOR_NONE) + return; + + /* + * Since the CoCo threat model includes the host, the only reliable + * source of entropy that can be neither observed nor manipulated is + * RDRAND. Usually, RDRAND failure is considered tolerable, but since a + * host can possibly induce failures consistently, it's important to at + * least ensure the RNG gets some initial random seeds. + */ + for (i =3D 0; i < ARRAY_SIZE(rng_seed); i +=3D longs) { + longs =3D arch_get_random_longs(&rng_seed[i], ARRAY_SIZE(rng_seed) - i); + + /* + * A zero return value means that the guest doesn't have RDRAND + * or the CPU is physically broken, and in both cases that + * means most crypto inside of the CoCo instance will be + * broken, defeating the purpose of CoCo in the first place. So + * just panic here because it's absolutely unsafe to continue + * executing. + */ + if (longs =3D=3D 0) + panic("RDRAND is defective."); + } + add_device_randomness(rng_seed, sizeof(rng_seed)); + memzero_explicit(rng_seed, sizeof(rng_seed)); +} diff --git a/arch/x86/include/asm/coco.h b/arch/x86/include/asm/coco.h index 76c310b19b11..e9d059449885 100644 --- a/arch/x86/include/asm/coco.h +++ b/arch/x86/include/asm/coco.h @@ -15,6 +15,7 @@ extern enum cc_vendor cc_vendor; void cc_set_mask(u64 mask); u64 cc_mkenc(u64 val); u64 cc_mkdec(u64 val); +void cc_random_init(void); #else #define cc_vendor (CC_VENDOR_NONE) =20 @@ -27,6 +28,7 @@ static inline u64 cc_mkdec(u64 val) { return val; } +static inline void cc_random_init(void) { } #endif =20 #endif /* _ASM_X86_COCO_H */ diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 84201071dfac..30a653cfc7d2 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -994,6 +995,7 @@ void __init setup_arch(char **cmdline_p) * memory size. */ mem_encrypt_setup_arch(); + cc_random_init(); =20 efi_fake_memmap(); efi_find_mirror(); --=20 2.43.0