From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1nI1vM-0007He-7C for mharc-grub-devel@gnu.org; Thu, 10 Feb 2022 00:23:21 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39574) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nI1vF-0007H6-Tm for grub-devel@gnu.org; Thu, 10 Feb 2022 00:23:17 -0500 Received: from [2607:f8b0:4864:20::e2d] (port=33420 helo=mail-vs1-xe2d.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nI1vE-0008RQ-3o for grub-devel@gnu.org; Thu, 10 Feb 2022 00:23:13 -0500 Received: by mail-vs1-xe2d.google.com with SMTP id r20so5164638vsn.0 for ; Wed, 09 Feb 2022 21:23:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=efficientek-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=rHphnTxofX2XauCiRs11SeqHZMgu29olXTDVD8pgTMI=; b=62QKYeHeQNZbajylGo7Bwe9QbqKKNuVD1JsjjuP3NXP1IjCCFrwtKCVEZRv5Fku7cd 1XeEo/JO49NR6rov8WAsCSaayjmtikSfN+5kROijDa3vbc5wkTQzuf20Qo4Bi6Myc79C gPWxqvlPs2YwpWXWGQ8B1wmPFbD0IY9iiAsAbTDQUXHqe8dYKFeEGg4u5RkoeTJjixKz A5zuTdTOrNZV6ObY+N3hsXvn5kEbyEz+U6eGywdOXvupgfhEC0GVFu17QwZPNUZ6lrxe 0Ue2UuxBZBytwxAe2+8FZhWfCHiBISx49keQ17HaJA+LCGP6seMEQuWOsMjbkyL9v29w ntKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rHphnTxofX2XauCiRs11SeqHZMgu29olXTDVD8pgTMI=; b=PekdB3cMUdFwPtZ800IZ135Gm/hBJCYAp/XGtmNTL1IHfi7WHR8w26LDdKgIR57m8S yYT6fJG70uTtUm27kJdhZYJe5BdrfIuLvEe/IzfHnQxwJmR5qXWbhZjpe6v6WTLjrqcz e+L9HwjdXQTm3DS/rjbBCNCpcvM0P7F6znc8UR4xICSNHpmqFfCz1XEMCvhKUBqtDcQe MM65kxkcFGJIMQbHFAJG23hP7BG1XPESLr+BuKncV8GSpaUPaZZ/91Gx4sxzUAPePZfo WmmNOX1uKgMR3jZKFQ3SAtlWLTy8dMWK2A//EWihBMHV+W4w0TSF/Q8pEnbnnd9y11MY 5sJA== X-Gm-Message-State: AOAM530iiFqjwDg4jKYNLExEz9486Z9GLEB0Wfab7d+/LmFrpP8Bamqn b9T9yG2SGPXa6O6tAQhfeoHAQrcqqUEX3g== X-Google-Smtp-Source: ABdhPJze/3tVKdV7/pskPXq7Ym+KpV63C9GZK1mFmJtHIvDOywlMKCtALsFwuZjs4lK1Fq+ro1ZYvA== X-Received: by 2002:a05:6214:19c7:: with SMTP id j7mr3898550qvc.71.1644470580583; Wed, 09 Feb 2022 21:23:00 -0800 (PST) Received: from localhost.localdomain (garza.riseup.net. [198.252.153.109]) by smtp.gmail.com with ESMTPSA id s6sm10377501qtw.18.2022.02.09.21.22.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Feb 2022 21:23:00 -0800 (PST) From: Glenn Washburn To: Daniel Kiper , grub-devel@gnu.org Cc: Glenn Washburn Subject: [PATCH v3 2/2] cryptodisk: Allows UUIDs to be compared in a dash-insensitive manner Date: Wed, 9 Feb 2022 23:22:14 -0600 Message-Id: <079b2d4dbdacbfa09372a07805857be7be2cbf7f.1644470167.git.development@efficientek.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::e2d (failed) Received-SPF: pass client-ip=2607:f8b0:4864:20::e2d; envelope-from=development@efficientek.com; helo=mail-vs1-xe2d.google.com X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Feb 2022 05:23:18 -0000 A user can now specify UUID strings with dashes, instead of having to remove dashes. This is backwards-compatability preserving and also fixes a source of user confusion over the inconsistency with how UUIDs are specified between file system UUIDs and cryptomount UUIDs. Since cryptsetup, the reference implementation for LUKS, displays and generates UUIDs with dashes there has been additional confusion when using the UUID strings from cryptsetup as exact input into GRUB does not find the expected cryptodisk. A new function grub_uuidcasecmp is added that is general enough to be used other places where UUIDs are being compared. Signed-off-by: Glenn Washburn --- grub-core/disk/cryptodisk.c | 4 ++-- grub-core/disk/geli.c | 2 +- grub-core/disk/luks.c | 21 ++++----------------- grub-core/disk/luks2.c | 15 ++++----------- include/grub/misc.h | 27 +++++++++++++++++++++++++++ 5 files changed, 38 insertions(+), 31 deletions(-) diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c index 497097394..3015e3bd5 100644 --- a/grub-core/disk/cryptodisk.c +++ b/grub-core/disk/cryptodisk.c @@ -679,7 +679,7 @@ 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) + if (grub_uuidcasecmp (name + sizeof ("cryptouuid/") - 1, dev->uuid, sizeof (dev->uuid)) == 0) break; } else @@ -909,7 +909,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_uuidcasecmp (dev->uuid, uuid, sizeof (dev->uuid)) == 0) return dev; return NULL; } diff --git a/grub-core/disk/geli.c b/grub-core/disk/geli.c index 23789c43f..43a63cef8 100644 --- a/grub-core/disk/geli.c +++ b/grub-core/disk/geli.c @@ -301,7 +301,7 @@ configure_ciphers (grub_disk_t disk, grub_cryptomount_args_t cargs) return NULL; } - if (cargs->search_uuid != NULL && grub_strcasecmp (cargs->search_uuid, uuid) != 0) + if (cargs->search_uuid != NULL && grub_uuidcasecmp (cargs->search_uuid, uuid, sizeof (uuid)) != 0) { grub_dprintf ("geli", "%s != %s\n", uuid, cargs->search_uuid); return NULL; diff --git a/grub-core/disk/luks.c b/grub-core/disk/luks.c index d74f004b6..e522b5162 100644 --- a/grub-core/disk/luks.c +++ b/grub-core/disk/luks.c @@ -66,10 +66,7 @@ static grub_cryptodisk_t configure_ciphers (grub_disk_t disk, grub_cryptomount_args_t cargs) { grub_cryptodisk_t newdev; - const char *iptr; struct grub_luks_phdr header; - char *optr; - char uuid[sizeof (header.uuid) + 1]; char ciphername[sizeof (header.cipherName) + 1]; char ciphermode[sizeof (header.cipherMode) + 1]; char hashspec[sizeof (header.hashSpec) + 1]; @@ -95,19 +92,9 @@ configure_ciphers (grub_disk_t disk, grub_cryptomount_args_t cargs) || grub_be_to_cpu16 (header.version) != 1) return NULL; - grub_memset (uuid, 0, sizeof (uuid)); - optr = uuid; - for (iptr = header.uuid; iptr < &header.uuid[ARRAY_SIZE (header.uuid)]; - iptr++) + if (cargs->search_uuid != NULL && grub_uuidcasecmp (cargs->search_uuid, header.uuid, sizeof (header.uuid)) != 0) { - if (*iptr != '-') - *optr++ = *iptr; - } - *optr = 0; - - if (cargs->search_uuid != NULL && grub_strcasecmp (cargs->search_uuid, uuid) != 0) - { - grub_dprintf ("luks", "%s != %s\n", uuid, cargs->search_uuid); + grub_dprintf ("luks", "%s != %s\n", header.uuid, cargs->search_uuid); return NULL; } @@ -126,7 +113,7 @@ configure_ciphers (grub_disk_t disk, grub_cryptomount_args_t cargs) newdev->source_disk = NULL; newdev->log_sector_size = GRUB_LUKS1_LOG_SECTOR_SIZE; newdev->total_sectors = grub_disk_native_sectors (disk) - newdev->offset_sectors; - grub_memcpy (newdev->uuid, uuid, sizeof (uuid)); + grub_memcpy (newdev->uuid, header.uuid, sizeof (header.uuid)); newdev->modname = "luks"; /* Configure the hash used for the AF splitter and HMAC. */ @@ -146,7 +133,7 @@ configure_ciphers (grub_disk_t disk, grub_cryptomount_args_t cargs) return NULL; } - COMPILE_TIME_ASSERT (sizeof (newdev->uuid) >= sizeof (uuid)); + COMPILE_TIME_ASSERT (sizeof (newdev->uuid) >= sizeof (header.uuid)); return newdev; } diff --git a/grub-core/disk/luks2.c b/grub-core/disk/luks2.c index 2c13246f2..6509010e9 100644 --- a/grub-core/disk/luks2.c +++ b/grub-core/disk/luks2.c @@ -353,8 +353,6 @@ luks2_scan (grub_disk_t disk, grub_cryptomount_args_t cargs) { grub_cryptodisk_t cryptodisk; grub_luks2_header_t header; - char uuid[sizeof (header.uuid) + 1]; - grub_size_t i, j; if (cargs->check_boot) return NULL; @@ -365,14 +363,9 @@ luks2_scan (grub_disk_t disk, grub_cryptomount_args_t cargs) return NULL; } - for (i = 0, j = 0; i < sizeof (header.uuid); i++) - if (header.uuid[i] != '-') - uuid[j++] = header.uuid[i]; - uuid[j] = '\0'; - - if (cargs->search_uuid != NULL && grub_strcasecmp (cargs->search_uuid, uuid) != 0) + if (cargs->search_uuid != NULL && grub_uuidcasecmp (cargs->search_uuid, header.uuid, sizeof (header.uuid)) != 0) { - grub_dprintf ("luks2", "%s != %s\n", uuid, cargs->search_uuid); + grub_dprintf ("luks2", "%s != %s\n", header.uuid, cargs->search_uuid); return NULL; } @@ -380,8 +373,8 @@ luks2_scan (grub_disk_t disk, grub_cryptomount_args_t cargs) if (!cryptodisk) return NULL; - COMPILE_TIME_ASSERT (sizeof (cryptodisk->uuid) >= sizeof (uuid)); - grub_memcpy (cryptodisk->uuid, uuid, sizeof (uuid)); + COMPILE_TIME_ASSERT (sizeof (cryptodisk->uuid) >= sizeof (header.uuid)); + grub_memcpy (cryptodisk->uuid, header.uuid, sizeof (header.uuid)); cryptodisk->modname = "luks2"; return cryptodisk; diff --git a/include/grub/misc.h b/include/grub/misc.h index 7d2b55196..41d64a5c3 100644 --- a/include/grub/misc.h +++ b/include/grub/misc.h @@ -243,6 +243,33 @@ grub_strncasecmp (const char *s1, const char *s2, grub_size_t n) - (int) grub_tolower ((grub_uint8_t) *s2); } +/* Do a case insensitive compare of two UUID strings by ignoring all dashes */ +static inline int +grub_uuidcasecmp (const char *uuid1, const char *uuid2, grub_size_t n) +{ + if (n == 0) + return 0; + + while (*s1 && *s2 && --n) + { + /* Skip forward to non-dash on both UUIDs. */ + while ('-' == *s1) + ++s1; + + while ('-' == *s2) + ++s2; + + if (grub_tolower (*s1) != grub_tolower (*s2)) + break; + + s1++; + s2++; + } + + return (int) grub_tolower ((grub_uint8_t) *s1) + - (int) grub_tolower ((grub_uint8_t) *s2); +} + /* * Note that these differ from the C standard's definitions of strtol, * strtoul(), and strtoull() by the addition of two const qualifiers on the end -- 2.27.0