And it seems the next function can be used to allow keyfile-offset and keyfile-size: file.h: grub_file_t grub_file_offset_open (grub_file_t parent, enum grub_file_type type, grub_off_t start, grub_off_t size); So only grub_cmd_cryptomount can be modified for this.
Dmitry пн, 9 нояб. 2020 г. в 10:56, Dmitry <reagen...@gmail.com>: > Thanks for feedback. First of all I think it's preferable to introduce > the master-key option at the beginning. Because I see no point for a user > to use a standard slot key along with a detached header. > Decryption from key to master key takes a long time. (30 seconds for > argon2i). > Regarding keyfile-offset and keyfile-size options I suggest to introduce > this options in separate patches. Yes, maybe you variant to pass the > pointer and size > (correct me if I am wrong) to luks2_recover_key is better of files. > But then you need to think in advance how to add master-key option. > > Dmitry > > пн, 9 нояб. 2020 г. в 06:16, Glenn Washburn <developm...@efficientek.com>: > >> I've read through the patch but not applied or tested it. However, it >> looks like it does the job. In fact, its fairly similar in parts to a >> patch, which adds LUKS2 keyfile and detached header support, I've been >> waiting to send to the list until the previous LUKS1 keyfile and >> detached header support gets included (which my patches rely on). >> >> One implementation difference in this patch from the other one is that >> this one passes the key file to recover_key as a grub_file_t instead of >> passing the key contents. I prefer the previous method because it >> consolidates key file reading in grub_cmd_cryptomount, whereas this >> patch requires each module to do its own reading. The disadvantage is >> this causes extra code in the modules that could be consolidated and I >> don't see much advantage to this. By having grub_cmd_cryptomount do >> the work we also get keyfile-offset and keyfile-size options in the >> previous patch, for not much extra work. >> >> A minor nit, there is not error checking on grub_file_seek calls and >> grub_file_read errors are occluded. However, there are some changes in >> this patch which I think make the code a bit more aesthetically >> pleasing. >> >> While, I like that this patch allows for passing a master key file, I >> think this feature should be build on the previous patch series. So I >> don't recommend this patch be accepted. >> >> Glenn >> >> On Sat, 7 Nov 2020 19:36:35 +0300 >> reagentoo <reagen...@gmail.com> wrote: >> >> > From: Dmitry Baranov <reagen...@gmail.com> >> > >> > Hello. >> > Could someone make initial review? >> > The main difference between this patch and the previous ones is >> > the ability to use a master key file with a detached header. >> > This patch does not provide luks1 and geli support yet (luks2 only). >> > >> > Best Regards, >> > Dmitry >> > >> > --- >> > grub-core/disk/cryptodisk.c | 99 +++++++++++++++----- >> > grub-core/disk/luks2.c | 178 >> > ++++++++++++++++++++++++++++-------- include/grub/cryptodisk.h | >> > 9 +- 3 files changed, 222 insertions(+), 64 deletions(-) >> > >> > diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c >> > index 13af84dd1..987a39b16 100644 >> > --- a/grub-core/disk/cryptodisk.c >> > +++ b/grub-core/disk/cryptodisk.c >> > @@ -41,6 +41,9 @@ 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}, >> > + {"header", 'H', 0, N_("Read header from file"), 0, >> > ARG_TYPE_STRING}, >> > + {"key-file", 'k', 0, N_("Read key from file"), 0, >> > ARG_TYPE_STRING}, >> > + {"master-key-file", 'K', 0, N_("Use a master key stored in a >> > file"), 0, ARG_TYPE_STRING}, {0, 0, 0, 0, 0, 0} >> > }; >> > >> > @@ -967,6 +970,7 @@ grub_util_cryptodisk_get_uuid (grub_disk_t disk) >> > >> > static int check_boot, have_it; >> > static char *search_uuid; >> > +static grub_file_t hdr_file, key_file, mkey_file; >> > >> > static void >> > cryptodisk_close (grub_cryptodisk_t dev) >> > @@ -991,13 +995,13 @@ grub_cryptodisk_scan_device_real (const char >> > *name, grub_disk_t source) >> > FOR_CRYPTODISK_DEVS (cr) >> > { >> > - dev = cr->scan (source, search_uuid, check_boot); >> > + dev = cr->scan (source, hdr_file, search_uuid, check_boot); >> > if (grub_errno) >> > return grub_errno; >> > if (!dev) >> > continue; >> > >> > - err = cr->recover_key (source, dev); >> > + err = cr->recover_key (source, dev, hdr_file, key_file, >> > mkey_file); if (err) >> > { >> > cryptodisk_close (dev); >> > @@ -1038,7 +1042,7 @@ grub_cryptodisk_cheat_mount (const char >> > *sourcedev, const char *cheat) >> > FOR_CRYPTODISK_DEVS (cr) >> > { >> > - dev = cr->scan (source, search_uuid, check_boot); >> > + dev = cr->scan (source, 0, search_uuid, check_boot); >> > if (grub_errno) >> > return grub_errno; >> > if (!dev) >> > @@ -1087,11 +1091,59 @@ grub_cryptodisk_scan_device (const char *name, >> > static grub_err_t >> > grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char >> > **args) { >> > + grub_err_t ret = GRUB_ERR_NONE; >> > + >> > struct grub_arg_list *state = ctxt->state; >> > >> > if (argc < 1 && !state[1].set && !state[2].set) >> > return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name >> > required"); >> > + hdr_file = NULL; >> > + key_file = NULL; >> > + mkey_file = NULL; >> > + >> > + if (state[3].set) >> > + { >> > + if (state[0].set) >> > + { >> > + ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "cannot use UUID >> > lookup with detached header"); >> > + goto err; >> > + } >> > + >> > + hdr_file = grub_file_open (state[3].arg, GRUB_FILE_TYPE_NONE); >> > + if (!hdr_file) >> > + { >> > + ret = grub_errno; >> > + goto err; >> > + } >> > + } >> > + >> > + if (state[4].set) >> > + { >> > + if (state[5].set) >> > + { >> > + ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "cannot use key >> > with master key"); >> > + goto err; >> > + } >> > + >> > + key_file = grub_file_open (state[4].arg, GRUB_FILE_TYPE_NONE); >> > + if (!key_file) >> > + { >> > + ret = grub_errno; >> > + goto err; >> > + } >> > + } >> > + >> > + if (state[5].set) >> > + { >> > + mkey_file = grub_file_open (state[5].arg, GRUB_FILE_TYPE_NONE); >> > + if (!mkey_file) >> > + { >> > + ret = grub_errno; >> > + goto err; >> > + } >> > + } >> > + >> > have_it = 0; >> > if (state[0].set) >> > { >> > @@ -1102,7 +1154,7 @@ grub_cmd_cryptomount (grub_extcmd_context_t >> > ctxt, int argc, char **args) { >> > grub_dprintf ("cryptodisk", >> > "already mounted as crypto%lu\n", dev->id); >> > - return GRUB_ERR_NONE; >> > + goto err; >> > } >> > >> > check_boot = state[2].set; >> > @@ -1111,8 +1163,11 @@ grub_cmd_cryptomount (grub_extcmd_context_t >> > ctxt, int argc, char **args) search_uuid = NULL; >> > >> > if (!have_it) >> > - return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such >> > cryptodisk found"); >> > - return GRUB_ERR_NONE; >> > + { >> > + ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "no such >> > cryptodisk found"); >> > + goto err; >> > + } >> > + goto err; >> > } >> > else if (state[1].set || (argc == 0 && state[2].set)) >> > { >> > @@ -1120,11 +1175,10 @@ grub_cmd_cryptomount (grub_extcmd_context_t >> > ctxt, int argc, char **args) check_boot = state[2].set; >> > grub_device_iterate (&grub_cryptodisk_scan_device, NULL); >> > search_uuid = NULL; >> > - return GRUB_ERR_NONE; >> > + goto err; >> > } >> > else >> > { >> > - grub_err_t err; >> > grub_disk_t disk; >> > grub_cryptodisk_t dev; >> > char *diskname; >> > @@ -1147,27 +1201,30 @@ grub_cmd_cryptomount (grub_extcmd_context_t >> > ctxt, int argc, char **args) { >> > if (disklast) >> > *disklast = ')'; >> > - return grub_errno; >> > + ret = grub_errno; >> > + goto err; >> > } >> > >> > dev = grub_cryptodisk_get_by_source_disk (disk); >> > if (dev) >> > - { >> > - grub_dprintf ("cryptodisk", "already mounted as >> > crypto%lu\n", dev->id); >> > - grub_disk_close (disk); >> > - if (disklast) >> > - *disklast = ')'; >> > - return GRUB_ERR_NONE; >> > - } >> > - >> > - err = grub_cryptodisk_scan_device_real (diskname, disk); >> > + grub_dprintf ("cryptodisk", "already mounted as >> > crypto%lu\n", dev->id); >> > + else >> > + ret = grub_cryptodisk_scan_device_real (diskname, disk); >> > >> > grub_disk_close (disk); >> > if (disklast) >> > *disklast = ')'; >> > - >> > - return err; >> > } >> > + >> > + err: >> > + if (hdr_file) >> > + grub_file_close (hdr_file); >> > + if (key_file) >> > + grub_file_close (key_file); >> > + if (mkey_file) >> > + grub_file_close (mkey_file); >> > + >> > + return ret; >> > } >> > >> > static struct grub_disk_dev grub_cryptodisk_dev = { >> > @@ -1299,7 +1356,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_("SOURCE|-u UUID|-a|-b|-H file|-k >> > file|-K file"), N_("Mount a crypto device."), options); >> > grub_procfs_register ("luks_script", &luks_script); >> > } >> > diff --git a/grub-core/disk/luks2.c b/grub-core/disk/luks2.c >> > index 31d7166fc..c29b472e6 100644 >> > --- a/grub-core/disk/luks2.c >> > +++ b/grub-core/disk/luks2.c >> > @@ -309,13 +309,22 @@ luks2_get_keyslot (grub_luks2_keyslot_t *k, >> > grub_luks2_digest_t *d, grub_luks2_s >> > /* Determine whether to use primary or secondary header */ >> > static grub_err_t >> > -luks2_read_header (grub_disk_t disk, grub_luks2_header_t *outhdr) >> > +luks2_read_header (grub_disk_t disk, grub_file_t hdr_file, >> > grub_luks2_header_t *outhdr) { >> > grub_luks2_header_t primary, secondary, *header = &primary; >> > grub_err_t ret; >> > >> > /* Read the primary LUKS header. */ >> > - ret = grub_disk_read (disk, 0, 0, sizeof (primary), &primary); >> > + if (hdr_file) >> > + { >> > + grub_file_seek (hdr_file, 0); >> > + if (grub_file_read (hdr_file, &primary, sizeof (primary)) != >> > sizeof (primary)) >> > + ret = GRUB_ERR_READ_ERROR; >> > + else >> > + ret = GRUB_ERR_NONE; >> > + } >> > + else >> > + ret = grub_disk_read (disk, 0, 0, sizeof (primary), &primary); >> > if (ret) >> > return ret; >> > >> > @@ -325,7 +334,16 @@ luks2_read_header (grub_disk_t disk, >> > grub_luks2_header_t *outhdr) return GRUB_ERR_BAD_SIGNATURE; >> > >> > /* Read the secondary header. */ >> > - ret = grub_disk_read (disk, 0, grub_be_to_cpu64 >> > (primary.hdr_size), sizeof (secondary), &secondary); >> > + if (hdr_file) >> > + { >> > + grub_file_seek (hdr_file, grub_be_to_cpu64 (primary.hdr_size)); >> > + if (grub_file_read (hdr_file, &secondary, sizeof (secondary)) >> > != sizeof (secondary)) >> > + ret = GRUB_ERR_READ_ERROR; >> > + else >> > + ret = GRUB_ERR_NONE; >> > + } >> > + else >> > + ret = grub_disk_read (disk, 0, grub_be_to_cpu64 >> > (primary.hdr_size), sizeof (secondary), &secondary); if (ret) >> > return ret; >> > >> > @@ -342,7 +360,7 @@ luks2_read_header (grub_disk_t disk, >> > grub_luks2_header_t *outhdr) } >> > >> > static grub_cryptodisk_t >> > -luks2_scan (grub_disk_t disk, const char *check_uuid, int check_boot) >> > +luks2_scan (grub_disk_t disk, grub_file_t hdr_file, const char >> > *check_uuid, int check_boot) { >> > grub_cryptodisk_t cryptodisk; >> > grub_luks2_header_t header; >> > @@ -352,7 +370,7 @@ luks2_scan (grub_disk_t disk, const char >> > *check_uuid, int check_boot) if (check_boot) >> > return NULL; >> > >> > - if (luks2_read_header (disk, &header)) >> > + if (luks2_read_header (disk, hdr_file, &header)) >> > { >> > grub_errno = GRUB_ERR_NONE; >> > return NULL; >> > @@ -415,7 +433,7 @@ luks2_verify_key (grub_luks2_digest_t *d, >> > grub_uint8_t *candidate_key, >> > static grub_err_t >> > luks2_decrypt_key (grub_uint8_t *out_key, >> > - grub_disk_t disk, grub_cryptodisk_t crypt, >> > + grub_disk_t disk, grub_cryptodisk_t crypt, >> > grub_file_t hdr_file, grub_luks2_keyslot_t *k, >> > const grub_uint8_t *passphrase, grub_size_t >> > passphraselen) { >> > @@ -491,7 +509,16 @@ luks2_decrypt_key (grub_uint8_t *out_key, >> > } >> > >> > grub_errno = GRUB_ERR_NONE; >> > - ret = grub_disk_read (disk, 0, k->area.offset, k->area.size, >> > split_key); >> > + if (hdr_file) >> > + { >> > + grub_file_seek (hdr_file, k->area.offset); >> > + if (grub_file_read (hdr_file, split_key, k->area.size) != >> > k->area.size) >> > + ret = GRUB_ERR_READ_ERROR; >> > + else >> > + ret = GRUB_ERR_NONE; >> > + } >> > + else >> > + ret = grub_disk_read (disk, 0, k->area.offset, k->area.size, >> > split_key); if (ret) >> > { >> > grub_error (GRUB_ERR_IO, "Read error: %s\n", grub_errmsg); >> > @@ -531,12 +558,16 @@ 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_file_t hdr_file, grub_file_t key_file, >> > grub_file_t mkey_file) { >> > + char cipher[32]; >> > + char *passphrase = NULL; >> > grub_uint8_t candidate_key[GRUB_CRYPTODISK_MAX_KEYLEN]; >> > - char passphrase[MAX_PASSPHRASE], cipher[32]; >> > + grub_size_t candidate_key_len, passphrase_len; >> > char *json_header = NULL, *part = NULL, *ptr; >> > - grub_size_t candidate_key_len = 0, i, size; >> > + grub_off_t json_header_offset; >> > + grub_size_t json_header_size, i, size; >> > grub_luks2_header_t header; >> > grub_luks2_keyslot_t keyslot; >> > grub_luks2_digest_t digest; >> > @@ -545,7 +576,7 @@ luks2_recover_key (grub_disk_t disk, >> > grub_json_t *json = NULL, keyslots; >> > grub_err_t ret; >> > >> > - ret = luks2_read_header (disk, &header); >> > + ret = luks2_read_header (disk, hdr_file, &header); >> > if (ret) >> > return ret; >> > >> > @@ -554,8 +585,19 @@ luks2_recover_key (grub_disk_t disk, >> > return GRUB_ERR_OUT_OF_MEMORY; >> > >> > /* Read the JSON area. */ >> > - ret = grub_disk_read (disk, 0, grub_be_to_cpu64 >> > (header.hdr_offset) + sizeof (header), >> > - grub_be_to_cpu64 (header.hdr_size) - sizeof >> > (header), json_header); >> > + json_header_offset = grub_be_to_cpu64 (header.hdr_offset) + sizeof >> > (header); >> > + json_header_size = grub_be_to_cpu64 (header.hdr_size) - sizeof >> > (header); + >> > + if (hdr_file) >> > + { >> > + grub_file_seek (hdr_file, json_header_offset); >> > + if (grub_file_read (hdr_file, json_header, json_header_size) >> > != json_header_size) >> > + ret = GRUB_ERR_READ_ERROR; >> > + else >> > + ret = GRUB_ERR_NONE; >> > + } >> > + else >> > + ret = grub_disk_read (disk, 0, json_header_offset, >> > json_header_size, json_header); if (ret) >> > goto err; >> > >> > @@ -570,16 +612,47 @@ luks2_recover_key (grub_disk_t disk, >> > goto err; >> > } >> > >> > - /* 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 (mkey_file) >> > { >> > - ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Passphrase not >> > supplied"); >> > - goto err; >> > + /* Get the master key from file. */ >> > + candidate_key_len = grub_file_read (mkey_file, candidate_key, >> > GRUB_CRYPTODISK_MAX_KEYLEN); >> > + if (candidate_key_len == (grub_size_t)-1) >> > + { >> > + ret = grub_error (GRUB_ERR_FILE_READ_ERROR, "Error reading >> > key file"); >> > + goto err; >> > + } >> > + if (candidate_key_len == 0) >> > + { >> > + ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Key not >> > supplied"); >> > + goto err; >> > + } >> > + } >> > + else if (key_file) >> > + { >> > + /* Get the passphrase from file. */ >> > + passphrase = grub_malloc (GRUB_CRYPTODISK_MAX_PASSPHRASE); >> > + passphrase_len = grub_file_read (key_file, passphrase, >> > GRUB_CRYPTODISK_MAX_PASSPHRASE); >> > + if (passphrase_len == (grub_size_t)-1) >> > + { >> > + ret = grub_error (GRUB_ERR_FILE_READ_ERROR, "Error reading >> > passphrase file"); >> > + goto err; >> > + } >> > + } >> > + else >> > + { >> > + /* 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); >> > + passphrase = grub_malloc (MAX_PASSPHRASE); >> > + if (!grub_password_get (passphrase, MAX_PASSPHRASE)) >> > + { >> > + ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Passphrase not >> > supplied"); >> > + goto err; >> > + } >> > + passphrase_len = grub_strlen (passphrase); >> > } >> > >> > if (grub_json_getvalue (&keyslots, json, "keyslots") || >> > @@ -604,6 +677,26 @@ luks2_recover_key (grub_disk_t disk, >> > >> > grub_dprintf ("luks2", "Trying keyslot %"PRIuGRUB_SIZE"\n", i); >> > >> > + if (mkey_file) >> > + { >> > + if (candidate_key_len != keyslot.key_size) >> > + { >> > + grub_dprintf ("luks2", "Wrong key length for keyslot >> > %"PRIuGRUB_SIZE": %s\n", >> > + i, grub_errmsg); >> > + continue; >> > + } >> > + >> > + ret = luks2_verify_key (&digest, candidate_key, >> > candidate_key_len); >> > + if (ret) >> > + { >> > + grub_dprintf ("luks2", "Could not open keyslot >> > %"PRIuGRUB_SIZE": %s\n", >> > + i, grub_errmsg); >> > + continue; >> > + } >> > + } >> > + else >> > + candidate_key_len = keyslot.key_size; >> > + >> > /* Set up disk according to keyslot's segment. */ >> > crypt->offset = grub_divmod64 (segment.offset, >> > segment.sector_size, NULL); crypt->log_sector_size = sizeof (unsigned >> > int) * 8 @@ -613,21 +706,24 @@ luks2_recover_key (grub_disk_t disk, >> > else >> > crypt->total_length = grub_strtoull (segment.size, NULL, 10); >> > >> > - ret = luks2_decrypt_key (candidate_key, disk, crypt, &keyslot, >> > - (const grub_uint8_t *) passphrase, >> > grub_strlen (passphrase)); >> > - if (ret) >> > + if (passphrase) >> > { >> > - grub_dprintf ("luks2", "Decryption with keyslot >> > %"PRIuGRUB_SIZE" failed: %s\n", >> > - i, grub_errmsg); >> > - continue; >> > - } >> > - >> > - ret = luks2_verify_key (&digest, candidate_key, >> > keyslot.key_size); >> > - if (ret) >> > - { >> > - grub_dprintf ("luks2", "Could not open keyslot >> > %"PRIuGRUB_SIZE": %s\n", >> > - i, grub_errmsg); >> > - continue; >> > + ret = luks2_decrypt_key (candidate_key, disk, crypt, >> > hdr_file, &keyslot, >> > + (const grub_uint8_t *) >> > passphrase, passphrase_len); >> > + if (ret) >> > + { >> > + grub_dprintf ("luks2", "Decryption with keyslot >> > %"PRIuGRUB_SIZE" failed: %s\n", >> > + i, grub_errmsg); >> > + continue; >> > + } >> > + >> > + ret = luks2_verify_key (&digest, candidate_key, >> > candidate_key_len); >> > + if (ret) >> > + { >> > + grub_dprintf ("luks2", "Could not open keyslot >> > %"PRIuGRUB_SIZE": %s\n", >> > + i, grub_errmsg); >> > + continue; >> > + } >> > } >> > >> > /* >> > @@ -635,13 +731,14 @@ luks2_recover_key (grub_disk_t disk, >> > * where each element is either empty or holds a key. >> > */ >> > grub_printf_ (N_("Slot %"PRIuGRUB_SIZE" opened\n"), i); >> > - >> > - candidate_key_len = keyslot.key_size; >> > break; >> > } >> > - if (candidate_key_len == 0) >> > + if (i == size) >> > { >> > - ret = grub_error (GRUB_ERR_ACCESS_DENIED, "Invalid >> > passphrase"); >> > + if (mkey_file) >> > + ret = grub_error (GRUB_ERR_ACCESS_DENIED, "Invalid key"); >> > + else >> > + ret = grub_error (GRUB_ERR_ACCESS_DENIED, "Invalid >> > passphrase"); goto err; >> > } >> > >> > @@ -666,6 +763,7 @@ luks2_recover_key (grub_disk_t disk, >> > >> > err: >> > grub_free (part); >> > + grub_free (passphrase); >> > grub_free (json_header); >> > grub_json_free (json); >> > return ret; >> > diff --git a/include/grub/cryptodisk.h b/include/grub/cryptodisk.h >> > index e1b21e785..b53006854 100644 >> > --- a/include/grub/cryptodisk.h >> > +++ b/include/grub/cryptodisk.h >> > @@ -21,6 +21,7 @@ >> > >> > #include <grub/disk.h> >> > #include <grub/crypto.h> >> > +#include <grub/file.h> >> > #include <grub/list.h> >> > #ifdef GRUB_UTIL >> > #include <grub/emu/hostdisk.h> >> > @@ -53,6 +54,7 @@ typedef enum >> > #define GRUB_CRYPTODISK_GF_LOG_BYTES (GRUB_CRYPTODISK_GF_LOG_SIZE - >> > 3) #define GRUB_CRYPTODISK_GF_BYTES (1U << >> > GRUB_CRYPTODISK_GF_LOG_BYTES) #define GRUB_CRYPTODISK_MAX_KEYLEN 128 >> > +#define GRUB_CRYPTODISK_MAX_PASSPHRASE 8192 >> > >> > struct grub_cryptodisk; >> > >> > @@ -106,9 +108,10 @@ struct grub_cryptodisk_dev >> > struct grub_cryptodisk_dev *next; >> > struct grub_cryptodisk_dev **prev; >> > >> > - 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_cryptodisk_t (*scan) (grub_disk_t disk, grub_file_t hdr_file, >> > + const char *check_uuid, int boot_only); >> > + grub_err_t (*recover_key) (grub_disk_t disk, grub_cryptodisk_t dev, >> > + grub_file_t hdr_file, grub_file_t >> > key_file, grub_file_t mkey_file); }; >> > typedef struct grub_cryptodisk_dev *grub_cryptodisk_dev_t; >> > >> >
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel