From 0939fef502c4b97d1facc7972a54d5dfeba4ab71 Mon Sep 17 00:00:00 2001 From: John Lane Date: Fri, 26 Jun 2015 22:48:03 +0100 Subject: [PATCH 5/7] Cryptomount support for hyphens in UUID --- grub-core/disk/cryptodisk.c | 20 +++++++++++++++++--- grub-core/disk/luks.c | 26 ++++++++------------------ include/grub/cryptodisk.h | 2 ++ 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c index 7f656f75c..c442d3a34 100644 --- a/grub-core/disk/cryptodisk.c +++ b/grub-core/disk/cryptodisk.c @@ -114,6 +114,20 @@ gf_mul_be (grub_uint8_t *o, const grub_uint8_t *a, const grub_uint8_t *b) } } +int +grub_cryptodisk_uuidcmp(char *uuid_a, char *uuid_b) +{ + while ((*uuid_a != '\0') && (*uuid_b != '\0')) + { + while (*uuid_a == '-') uuid_a++; + while (*uuid_b == '-') uuid_b++; + if (grub_toupper(*uuid_a) != grub_toupper(*uuid_b)) break; + uuid_a++; + uuid_b++; + } + return (*uuid_a == '\0') && (*uuid_b == '\0'); +} + static gcry_err_code_t grub_crypto_pcbc_decrypt (grub_crypto_cipher_handle_t cipher, void *out, void *in, grub_size_t size, @@ -509,8 +523,8 @@ grub_cryptodisk_open (const char *name, grub_disk_t disk) if (grub_memcmp (name, "cryptouuid/", sizeof ("cryptouuid/") - 1) == 0) { for (dev = cryptodisk_list; dev != NULL; dev = dev->next) - if (grub_strcasecmp (name + sizeof ("cryptouuid/") - 1, dev->uuid) == 0) - break; + if (grub_cryptodisk_uuidcmp(name + sizeof ("cryptouuid/") - 1, dev->uuid)) + break; } else { @@ -742,7 +756,7 @@ grub_cryptodisk_get_by_uuid (const char *uuid) { grub_cryptodisk_t dev; for (dev = cryptodisk_list; dev != NULL; dev = dev->next) - if (grub_strcasecmp (dev->uuid, uuid) == 0) + if (grub_cryptodisk_uuidcmp(dev->uuid, uuid)) return dev; return NULL; } diff --git a/grub-core/disk/luks.c b/grub-core/disk/luks.c index 4ebe21b4e..80a760670 100644 --- a/grub-core/disk/luks.c +++ b/grub-core/disk/luks.c @@ -127,6 +109,14 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid, ciphermode[sizeof (header.cipherMode)] = 0; grub_memcpy (hashspec, header.hashSpec, sizeof (header.hashSpec)); hashspec[sizeof (header.hashSpec)] = 0; + grub_memcpy (uuid, header.uuid, sizeof (header.uuid)); + uuid[sizeof (header.uuid)] = 0; + + if ( check_uuid && ! grub_cryptodisk_uuidcmp(check_uuid, uuid)) + { + grub_dprintf ("luks", "%s != %s\n", uuid, check_uuid); + return NULL; + } newdev = grub_cryptodisk_create (disk, uuid, ciphername, ciphermode, hashspec); diff --git a/include/grub/cryptodisk.h b/include/grub/cryptodisk.h index bb25ab730..01c02696e 100644 --- a/include/grub/cryptodisk.h +++ b/include/grub/cryptodisk.h @@ -168,4 +168,6 @@ grub_cryptodisk_t grub_cryptodisk_get_by_source_disk (grub_disk_t disk); grub_cryptodisk_t grub_cryptodisk_create (grub_disk_t disk, char *uuid, char *ciphername, char *ciphermode, char *digest); +int +grub_cryptodisk_uuidcmp(char *uuid_a, char *uuid_b); #endif -- 2.16.2