From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1kdhXZ-0001uw-38 for mharc-grub-devel@gnu.org; Fri, 13 Nov 2020 17:27:33 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:42508) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdhXX-0001ul-PP for grub-devel@gnu.org; Fri, 13 Nov 2020 17:27:31 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:13570) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdhXV-0005Kd-NT for grub-devel@gnu.org; Fri, 13 Nov 2020 17:27:31 -0500 Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 0ADM2jhx158685; Fri, 13 Nov 2020 17:27:25 -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=Qi6RwMWxh/4ODkdQ6B4V64UExjeb2UKcvk61zM+ClYs=; b=jgkduECRveTjBoP/lA18GkeYnL8chZd4nTCw3ayDfWLv5qE0uZNMlcTWWNk1+j6f21Q7 LYxK1BTlwH5MGd+eWw5a+2uR6bBCrlgFiDrcNxDjJKYPlzOW6EVuYbBHCoHior1owa49 1jeIR5QuDTf9F4q+HTaFJwXpGsKmrwwRzd+6ozV20TwGIxzjpdAauDXsE5F1SmtNtA9B 6oAnDR7C1nCkxcly5Qm5lMJBRwF+eCpeWc+VrDMytxLYgciomku/RfnOdXgEOb0MZtUL gJOZJ7fNZEQYuUOM7Wfg3ehDMlZqgtKHHD+JYhIPSRXxHmc9AXJ8JMhQPvR76x9VMZoB mw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 34t1yjhgh8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 13 Nov 2020 17:27:24 -0500 Received: from m0098404.ppops.net (m0098404.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 0ADMBbOI011975; Fri, 13 Nov 2020 17:27:24 -0500 Received: from ppma02dal.us.ibm.com (a.bd.3ea9.ip4.static.sl-reverse.com [169.62.189.10]) by mx0a-001b2d01.pphosted.com with ESMTP id 34t1yjhggv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 13 Nov 2020 17:27:24 -0500 Received: from pps.filterd (ppma02dal.us.ibm.com [127.0.0.1]) by ppma02dal.us.ibm.com (8.16.0.42/8.16.0.42) with SMTP id 0ADMHuXH021974; Fri, 13 Nov 2020 22:27:23 GMT Received: from b03cxnp08025.gho.boulder.ibm.com (b03cxnp08025.gho.boulder.ibm.com [9.17.130.17]) by ppma02dal.us.ibm.com with ESMTP id 34nk7akuqc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 13 Nov 2020 22:27:23 +0000 Received: from b03ledav004.gho.boulder.ibm.com (b03ledav004.gho.boulder.ibm.com [9.17.130.235]) by b03cxnp08025.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 0ADMRD1w11338342 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 13 Nov 2020 22:27:13 GMT Received: from b03ledav004.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 557EC78060; Fri, 13 Nov 2020 22:27:19 +0000 (GMT) Received: from b03ledav004.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 136AD7805C; Fri, 13 Nov 2020 22:27:17 +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 22:27:16 +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 v2 1/3] cryptodisk: make the password getter and additional argument to recover_key Date: Fri, 13 Nov 2020 14:25:08 -0800 Message-Id: <20201113222510.16958-2-jejb@linux.ibm.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20201113222510.16958-1-jejb@linux.ibm.com> References: <20201113222510.16958-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-13_19:2020-11-13, 2020-11-13 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 malwarescore=0 priorityscore=1501 spamscore=0 clxscore=1015 mlxscore=0 impostorscore=0 suspectscore=3 adultscore=0 mlxlogscore=999 lowpriorityscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2009150000 definitions=main-2011130141 Received-SPF: pass client-ip=148.163.156.1; envelope-from=jejb@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/13 17:10:30 X-ACL-Warn: Detected OS = Linux 3.x [generic] [fuzzy] 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 22:27:32 -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 --- v2: add conditional prompting to geli.c --- grub-core/disk/cryptodisk.c | 2 +- grub-core/disk/geli.c | 12 +++++++----- grub-core/disk/luks.c | 12 +++++++----- grub-core/disk/luks2.c | 12 +++++++----- include/grub/cryptodisk.h | 6 +++++- 5 files changed, 27 insertions(+), 17 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..3fece3f4a 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]; @@ -438,11 +439,12 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev) 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)) 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