From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1kwdV4-00042f-4t for mharc-grub-devel@gnu.org; Mon, 04 Jan 2021 22:59:14 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:45824) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kwdV2-00040r-L8 for grub-devel@gnu.org; Mon, 04 Jan 2021 22:59:12 -0500 Received: from mail-lf1-x130.google.com ([2a00:1450:4864:20::130]:43654) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kwdUz-0000Su-E9 for grub-devel@gnu.org; Mon, 04 Jan 2021 22:59:12 -0500 Received: by mail-lf1-x130.google.com with SMTP id 23so69463634lfg.10 for ; Mon, 04 Jan 2021 19:59:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=efficientek-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=cU1upqb1PAXbsfQU2zFlkD7sdr+BOczI4NG+/1hMjRM=; b=nvvvN49PMFVVhNkWcO7DLYlEHWiAzkfYBtVu6p8bcnIblkGonKOcKs4d3IWgCiSHQZ vN9sazSLtiudwy+yGS7ASkCWS1kCxXhYW13uG4Jc9/fHs6jhvwSGfM4SYcHqf0B4MhNr 5LgVOodQj3Zw5xrYp8vokZbeK3PHHK5RCNMuHmtRHD88b0QzreuoGApOJZ+lYXG14tkY LjxFTzGdWPJWuY9KT0qslurQxv07RQ5j5O3/LWIR35hUk0fnVvPvPTi8pMzUvbvzxdbE BD92bMhH0L1Z6cPtDrNio0iHiH6RYXSsdYldRLaNLcqKdmmlePrkOyNo0X/bBFt+vDCS jwRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=cU1upqb1PAXbsfQU2zFlkD7sdr+BOczI4NG+/1hMjRM=; b=aFiJmbFDcnZQ0TVrpiVjLRtIgJq66wOfqsqLmr896GWicCihWTVJowFFacNSjkL7e3 TSlHfOq4tvf9+5mgWWDKtXI6BuujbieBZh+Orw08D3lKPv8uCZOcLcv0K2ejCQHcH03g j5M1QWeyr0h+5yHCi9q700MXJBgOgtTmQvNCA1P1uJUSVlPO282FHQ7KNH4Lr7g2iJGa oUGE6OZowyUS5RXJpU5UTH8cjLImdPxjkDFcBDTDRSeOuI8iDYQVVxm3L92PPxAGRCzY rT1kSIyz7a9m5xN8oO091YMB9ERlbX2K/es+3YlrJeE9mPKg3CxiAutpLdJjHRVGKBoL E5Dw== X-Gm-Message-State: AOAM530uJKIz9BT+yJmPsiv6IvKjtjps8u/GPxnflTEEsnLPpfhBRldE UAXF8EOrpF6OtKqsHNqrmx8AZz75B3xRDw== X-Google-Smtp-Source: ABdhPJxzPJN9ROvzqb/PCSnnf1mSs6mCrSLDVyg6SORxq0ZD4bBRTxJA5I7IfqJ3hARkMv9wFv0EHQ== X-Received: by 2002:a19:4284:: with SMTP id p126mr31402354lfa.287.1609819146179; Mon, 04 Jan 2021 19:59:06 -0800 (PST) Received: from localhost.localdomain ([136.49.211.192]) by smtp.gmail.com with ESMTPSA id a8sm7474806lfj.65.2021.01.04.19.59.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Jan 2021 19:59:05 -0800 (PST) From: Glenn Washburn To: grub-devel@gnu.org Cc: Patrick Steinhardt , Daniel Kiper , Glenn Washburn Subject: [RFC PATCH] cryptodisk: Add infrastructure to pass data from cryptomount to cryptodisk modules Date: Mon, 4 Jan 2021 21:58:37 -0600 Message-Id: <20210105035837.3598760-1-development@efficientek.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=2a00:1450:4864:20::130; envelope-from=development@efficientek.com; helo=mail-lf1-x130.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, 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: Tue, 05 Jan 2021 03:59:12 -0000 As an example, passing a password as a cryptomount argument is implemented. However, the backends are not implemented, so testing this will return a not implemented error. Signed-off-by: Glenn Washburn --- This is a proof of concept of how I think the data passing from cryptomount to the crypto module backends should be done. Currently global variables and added parameters to recover_key are being used to do this in submitted patches. We want to avoid both of these. I've tested this patch with the rebased and reworked cryptodisk v7 patches sucessfully. Suggestions welcome. Glenn --- grub-core/disk/cryptodisk.c | 29 ++++++++++++++++++++--------- grub-core/disk/geli.c | 4 ++++ grub-core/disk/luks.c | 4 ++++ grub-core/disk/luks2.c | 4 ++++ include/grub/cryptodisk.h | 8 ++++++++ 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c index b62835acc..c582509f9 100644 --- a/grub-core/disk/cryptodisk.c +++ b/grub-core/disk/cryptodisk.c @@ -41,6 +41,7 @@ static const struct grub_arg_option options[] = /* TRANSLATORS: It's still restricted to cryptodisks only. */ {"all", 'a', 0, N_("Mount all."), 0, 0}, {"boot", 'b', 0, N_("Mount all volumes with `boot' flag set."), 0, 0}, + {"password", 'p', 0, N_("Password to open volumes."), 0, ARG_TYPE_STRING}, {0, 0, 0, 0, 0, 0} }; @@ -992,7 +993,9 @@ cryptodisk_close (grub_cryptodisk_t dev) } static grub_err_t -grub_cryptodisk_scan_device_real (const char *name, grub_disk_t source) +grub_cryptodisk_scan_device_real (const char *name, + grub_disk_t source, + grub_cryptomount_args_t cargs) { grub_err_t err; grub_cryptodisk_t dev; @@ -1011,6 +1014,7 @@ grub_cryptodisk_scan_device_real (const char *name, grub_disk_t source) if (!dev) continue; + *dev->cargs = *cargs; err = cr->recover_key (source, dev); if (err) { @@ -1076,7 +1080,7 @@ grub_cryptodisk_cheat_mount (const char *sourcedev, const char *cheat) static int grub_cryptodisk_scan_device (const char *name, - void *data __attribute__ ((unused))) + void *cargs) { grub_err_t err; grub_disk_t source; @@ -1089,7 +1093,7 @@ grub_cryptodisk_scan_device (const char *name, return 0; } - err = grub_cryptodisk_scan_device_real (name, source); + err = grub_cryptodisk_scan_device_real (name, source, (grub_cryptomount_args_t) cargs); grub_disk_close (source); @@ -1102,12 +1106,19 @@ static grub_err_t grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; + struct grub_cryptomount_args cargs = {0}; if (argc < 1 && !state[1].set && !state[2].set) return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required"); + if (state[3].set) /* password */ + { + cargs.key_data = (grub_uint8_t *) state[3].arg; + cargs.key_len = grub_strlen(state[3].arg); + } + have_it = 0; - if (state[0].set) + if (state[0].set) /* uuid */ { grub_cryptodisk_t dev; @@ -1121,18 +1132,18 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args) check_boot = state[2].set; search_uuid = args[0]; - grub_device_iterate (&grub_cryptodisk_scan_device, NULL); + grub_device_iterate (&grub_cryptodisk_scan_device, &cargs); search_uuid = NULL; if (!have_it) return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such cryptodisk found"); return GRUB_ERR_NONE; } - else if (state[1].set || (argc == 0 && state[2].set)) + else if (state[1].set || (argc == 0 && state[2].set)) /* -a|-b */ { search_uuid = NULL; check_boot = state[2].set; - grub_device_iterate (&grub_cryptodisk_scan_device, NULL); + grub_device_iterate (&grub_cryptodisk_scan_device, &cargs); search_uuid = NULL; return GRUB_ERR_NONE; } @@ -1174,7 +1185,7 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args) return GRUB_ERR_NONE; } - err = grub_cryptodisk_scan_device_real (diskname, disk); + err = grub_cryptodisk_scan_device_real (diskname, disk, &cargs); grub_disk_close (disk); if (disklast) @@ -1313,7 +1324,7 @@ GRUB_MOD_INIT (cryptodisk) { grub_disk_dev_register (&grub_cryptodisk_dev); cmd = grub_register_extcmd ("cryptomount", grub_cmd_cryptomount, 0, - N_("SOURCE|-u UUID|-a|-b"), + N_("[-p password] "), N_("Mount a crypto device."), options); grub_procfs_register ("luks_script", &luks_script); } diff --git a/grub-core/disk/geli.c b/grub-core/disk/geli.c index 2f34a35e6..0a7bd90da 100644 --- a/grub-core/disk/geli.c +++ b/grub-core/disk/geli.c @@ -414,6 +414,10 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev) grub_disk_addr_t sector; grub_err_t err; + /* Keyfiles are not implemented yet */ + if (dev->cargs->key_data || dev->cargs->key_len) + return GRUB_ERR_NOT_IMPLEMENTED_YET; + if (dev->cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE) return grub_error (GRUB_ERR_BUG, "cipher block is too long"); diff --git a/grub-core/disk/luks.c b/grub-core/disk/luks.c index 13103ea6a..e2a4a3bf5 100644 --- a/grub-core/disk/luks.c +++ b/grub-core/disk/luks.c @@ -165,6 +165,10 @@ luks_recover_key (grub_disk_t source, grub_size_t max_stripes = 1; char *tmp; + /* Keyfiles are not implemented yet */ + if (dev->cargs->key_data || dev->cargs->key_len) + return GRUB_ERR_NOT_IMPLEMENTED_YET; + err = grub_disk_read (source, 0, 0, sizeof (header), &header); if (err) return err; diff --git a/grub-core/disk/luks2.c b/grub-core/disk/luks2.c index 8d2457557..61ac070fe 100644 --- a/grub-core/disk/luks2.c +++ b/grub-core/disk/luks2.c @@ -556,6 +556,10 @@ luks2_recover_key (grub_disk_t source, grub_json_t *json = NULL, keyslots; grub_err_t ret; + /* Keyfiles are not implemented yet */ + if (crypt->cargs->key_data || crypt->cargs->key_len) + return GRUB_ERR_NOT_IMPLEMENTED_YET; + ret = luks2_read_header (source, &header); if (ret) return ret; diff --git a/include/grub/cryptodisk.h b/include/grub/cryptodisk.h index dcf17fbb3..433c75426 100644 --- a/include/grub/cryptodisk.h +++ b/include/grub/cryptodisk.h @@ -66,6 +66,13 @@ typedef gcry_err_code_t (*grub_cryptodisk_rekey_func_t) (struct grub_cryptodisk *dev, grub_uint64_t zoneno); +struct grub_cryptomount_args +{ + grub_uint8_t *key_data; + grub_size_t key_len; +}; +typedef struct grub_cryptomount_args *grub_cryptomount_args_t; + struct grub_cryptodisk { struct grub_cryptodisk *next; @@ -109,6 +116,7 @@ struct grub_cryptodisk grub_uint64_t last_rekey; int rekey_derived_size; grub_disk_addr_t partition_start; + grub_cryptomount_args_t cargs; }; typedef struct grub_cryptodisk *grub_cryptodisk_t; -- 2.27.0