From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1kdNoj-0001tw-EJ for mharc-grub-devel@gnu.org; Thu, 12 Nov 2020 20:23:57 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:45292) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdNoi-0001tp-Kq for grub-devel@gnu.org; Thu, 12 Nov 2020 20:23:56 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:50820 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdNog-0004H1-M1 for grub-devel@gnu.org; Thu, 12 Nov 2020 20:23:56 -0500 Received: from pps.filterd (m0098413.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 0AD13x9m054873; Thu, 12 Nov 2020 20:23:52 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=ZHwGDsPx/raRpCzbiJ7lFdvA14ggIZDjmSnR6GsAD3Q=; b=AStTJOm19vKeR/OaH9facRq7PcfbHDO/Ypj1S3uiEo3WSUxEXl97+ztQ7oyiLC/tGAxf P2dELDBwprSTbUp9PKZXzjOMEPOd35QaMS3PKl+MqIbF8ZfG4Hc/UA3/TAS9ZwpSCmMd SQqCtKg1q4EdyHssr8hk1mtrYd4TBtBp41nOgCR/xzjeXRfnxQQGmSDy193aLuHPNnMl y5Gme8lKef5Zk27oTMVTAcCHEDBWcACKRGFVmOkxyPvGn1wV+W2yQk7zRePOy1XLH8SW MO1f5JuD4Y1Q7Ehv06O5ybHwXWY7Jg31qeVPWj/cMFh/FqjOd99O8t1ZjDIpjG2OjW+/ 9w== Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 34sfkt92cp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 12 Nov 2020 20:23:52 -0500 Received: from m0098413.ppops.net (m0098413.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 0AD15qrw063357; Thu, 12 Nov 2020 20:23:51 -0500 Received: from ppma01dal.us.ibm.com (83.d6.3fa9.ip4.static.sl-reverse.com [169.63.214.131]) by mx0b-001b2d01.pphosted.com with ESMTP id 34sfkt92cf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 12 Nov 2020 20:23:51 -0500 Received: from pps.filterd (ppma01dal.us.ibm.com [127.0.0.1]) by ppma01dal.us.ibm.com (8.16.0.42/8.16.0.42) with SMTP id 0AD1MDFk029578; Fri, 13 Nov 2020 01:23:51 GMT Received: from b03cxnp07028.gho.boulder.ibm.com (b03cxnp07028.gho.boulder.ibm.com [9.17.130.15]) by ppma01dal.us.ibm.com with ESMTP id 34nk7b2ttq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 13 Nov 2020 01:23:51 +0000 Received: from b03ledav004.gho.boulder.ibm.com (b03ledav004.gho.boulder.ibm.com [9.17.130.235]) by b03cxnp07028.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 0AD1NlBS18022944 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 13 Nov 2020 01:23:47 GMT Received: from b03ledav004.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 44C6C7805C; Fri, 13 Nov 2020 01:23:47 +0000 (GMT) Received: from b03ledav004.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0F4C57805E; Fri, 13 Nov 2020 01:23:45 +0000 (GMT) Received: from jarvis.int.hansenpartnership.com (unknown [9.85.145.64]) by b03ledav004.gho.boulder.ibm.com (Postfix) with ESMTP; Fri, 13 Nov 2020 01:23:44 +0000 (GMT) From: James Bottomley To: grub-devel@gnu.org Cc: dovmurik@linux.vnet.ibm.com, Dov.Murik1@il.ibm.com, ashish.kalra@amd.com, brijesh.singh@amd.com, tobin@ibm.com, david.kaplan@amd.com, jon.grimm@amd.com, thomas.lendacky@amd.com, jejb@linux.ibm.com, frankeh@us.ibm.com, "Dr . David Alan Gilbert" Subject: [PATCH 1/3] cryptodisk: make the password getter and additional argument to recover_key Date: Thu, 12 Nov 2020 17:22:04 -0800 Message-Id: <20201113012206.24246-2-jejb@linux.ibm.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20201113012206.24246-1-jejb@linux.ibm.com> References: <20201113012206.24246-1-jejb@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.312, 18.0.737 definitions=2020-11-12_16:2020-11-12, 2020-11-12 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 lowpriorityscore=0 malwarescore=0 priorityscore=1501 bulkscore=0 spamscore=0 mlxlogscore=999 phishscore=0 mlxscore=0 impostorscore=0 adultscore=0 suspectscore=3 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2009150000 definitions=main-2011130001 Received-SPF: pass client-ip=148.163.158.5; envelope-from=jejb@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 20:22:35 X-ACL-Warn: Detected OS = Linux 3.x [generic] X-Spam_score_int: -19 X-Spam_score: -2.0 X-Spam_bar: -- X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Nov 2020 01:23:56 -0000 For AMD SEV environments, the grub boot password has to be retrieved from a given memory location rather than prompted for. This means that the standard password getter needs to be replaced with one that gets the passphrase from the SEV area and uses that instead. Adding the password getter as a passed in argument to recover_key() makes this possible. Signed-off-by: James Bottomley --- grub-core/disk/cryptodisk.c | 2 +- grub-core/disk/geli.c | 5 +++-- grub-core/disk/luks.c | 12 +++++++----- grub-core/disk/luks2.c | 12 +++++++----- include/grub/cryptodisk.h | 6 +++++- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c index a3d672f68..682f5a55d 100644 --- a/grub-core/disk/cryptodisk.c +++ b/grub-core/disk/cryptodisk.c @@ -997,7 +997,7 @@ grub_cryptodisk_scan_device_real (const char *name, grub_disk_t source) if (!dev) continue; - err = cr->recover_key (source, dev); + err = cr->recover_key (source, dev, grub_password_get); if (err) { cryptodisk_close (dev); diff --git a/grub-core/disk/geli.c b/grub-core/disk/geli.c index e9d23299a..5514c16a3 100644 --- a/grub-core/disk/geli.c +++ b/grub-core/disk/geli.c @@ -398,7 +398,8 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid, } static grub_err_t -recover_key (grub_disk_t source, grub_cryptodisk_t dev) +recover_key (grub_disk_t source, grub_cryptodisk_t dev, + grub_passwd_cb *password_get) { grub_size_t keysize; grub_uint8_t digest[GRUB_CRYPTO_MAX_MDLEN]; @@ -442,7 +443,7 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev) source->partition ? "," : "", tmp ? : "", dev->uuid); grub_free (tmp); - if (!grub_password_get (passphrase, MAX_PASSPHRASE)) + if (!password_get (passphrase, MAX_PASSPHRASE)) return grub_error (GRUB_ERR_BAD_ARGUMENT, "Passphrase not supplied"); /* Calculate the PBKDF2 of the user supplied passphrase. */ diff --git a/grub-core/disk/luks.c b/grub-core/disk/luks.c index 59702067a..165f4a6bd 100644 --- a/grub-core/disk/luks.c +++ b/grub-core/disk/luks.c @@ -152,7 +152,8 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid, static grub_err_t luks_recover_key (grub_disk_t source, - grub_cryptodisk_t dev) + grub_cryptodisk_t dev, + grub_passwd_cb *password_get) { struct grub_luks_phdr header; grub_size_t keysize; @@ -187,11 +188,12 @@ luks_recover_key (grub_disk_t source, tmp = NULL; if (source->partition) tmp = grub_partition_get_name (source->partition); - grub_printf_ (N_("Enter passphrase for %s%s%s (%s): "), source->name, - source->partition ? "," : "", tmp ? : "", - dev->uuid); + if (password_get == grub_password_get) + grub_printf_ (N_("Enter passphrase for %s%s%s (%s): "), source->name, + source->partition ? "," : "", tmp ? : "", + dev->uuid); grub_free (tmp); - if (!grub_password_get (passphrase, MAX_PASSPHRASE)) + if (!password_get (passphrase, MAX_PASSPHRASE)) { grub_free (split_key); return grub_error (GRUB_ERR_BAD_ARGUMENT, "Passphrase not supplied"); diff --git a/grub-core/disk/luks2.c b/grub-core/disk/luks2.c index 31d7166fc..984182aa9 100644 --- a/grub-core/disk/luks2.c +++ b/grub-core/disk/luks2.c @@ -531,7 +531,8 @@ luks2_decrypt_key (grub_uint8_t *out_key, static grub_err_t luks2_recover_key (grub_disk_t disk, - grub_cryptodisk_t crypt) + grub_cryptodisk_t crypt, + grub_passwd_cb *password_get) { grub_uint8_t candidate_key[GRUB_CRYPTODISK_MAX_KEYLEN]; char passphrase[MAX_PASSPHRASE], cipher[32]; @@ -573,10 +574,11 @@ luks2_recover_key (grub_disk_t disk, /* Get the passphrase from the user. */ if (disk->partition) part = grub_partition_get_name (disk->partition); - grub_printf_ (N_("Enter passphrase for %s%s%s (%s): "), disk->name, - disk->partition ? "," : "", part ? : "", - crypt->uuid); - if (!grub_password_get (passphrase, MAX_PASSPHRASE)) + if (password_get == grub_password_get) + grub_printf_ (N_("Enter passphrase for %s%s%s (%s): "), disk->name, + disk->partition ? "," : "", part ? : "", + crypt->uuid); + if (!password_get (passphrase, MAX_PASSPHRASE)) { ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Passphrase not supplied"); goto err; diff --git a/include/grub/cryptodisk.h b/include/grub/cryptodisk.h index e1b21e785..45dae5483 100644 --- a/include/grub/cryptodisk.h +++ b/include/grub/cryptodisk.h @@ -101,6 +101,9 @@ struct grub_cryptodisk }; typedef struct grub_cryptodisk *grub_cryptodisk_t; +/* must match prototype for grub_password_get */ +typedef int (grub_passwd_cb)(char buf[], unsigned buf_size); + struct grub_cryptodisk_dev { struct grub_cryptodisk_dev *next; @@ -108,7 +111,8 @@ struct grub_cryptodisk_dev grub_cryptodisk_t (*scan) (grub_disk_t disk, const char *check_uuid, int boot_only); - grub_err_t (*recover_key) (grub_disk_t disk, grub_cryptodisk_t dev); + grub_err_t (*recover_key) (grub_disk_t disk, grub_cryptodisk_t dev, + grub_passwd_cb *get_password); }; typedef struct grub_cryptodisk_dev *grub_cryptodisk_dev_t; -- 2.26.2