From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1k0tzX-0002se-5H for mharc-grub-devel@gnu.org; Wed, 29 Jul 2020 17:52:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50744) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k0tzS-0002nV-Su for grub-devel@gnu.org; Wed, 29 Jul 2020 17:51:58 -0400 Received: from mail-qk1-x744.google.com ([2607:f8b0:4864:20::744]:43990) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1k0tzO-0006KW-KH for grub-devel@gnu.org; Wed, 29 Jul 2020 17:51:58 -0400 Received: by mail-qk1-x744.google.com with SMTP id 2so19689565qkf.10 for ; Wed, 29 Jul 2020 14:51:54 -0700 (PDT) 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:in-reply-to:references :mime-version:content-transfer-encoding; bh=q621CIeBVxZ/TFnFUtQZz7OXcVXtzWG/D9Dwu6hvryg=; b=l+5sRvq1xt9hGog7oySR2WFOM5yxQotIqPDAQL4Oe//13bCnSvMpO3qOhauYLV6wk0 Vz4hprLIJDcSLjvZWPQb7WwsadM0eBytgkgFJHxpiRdhdgjKlIt0G/GRmR0tLrZ1V/Vm 2xfUdGyfi2phStVzkvynpIa22yjxWSkfnP0pl0C7m3bm/WiJ/F+WzFtNf14OFDwzD4WJ ech26+LRD+ru7FZlbjV/OKozjaY22ehvLFS4CUlyk74fxC4e+Efuo2oTWOLB+bkJqlls 2H8xHzNUKPV4YxOctSS8d0/idTDXZZk+7JBBtS+KrLpuFe99UgX/pMgL84Mn27dPMtcn frbA== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=q621CIeBVxZ/TFnFUtQZz7OXcVXtzWG/D9Dwu6hvryg=; b=Pr2iLbjDLNUX8dHGH64+Iggi4qmj/XCFd0MkVnga6Qsc2bsTAlBoZqxMTI0zlheUtv iQ9ghNaX92oycoosZ5+ue9pyi8iktEI7FRug6A2laa2obC6LJ8PAyjMuNwds5CZ+FaTJ P54ah4OPHRgWsvj3Xh+EV16E4Ll7/rfntWtvxh2jnWTpHJQ5q7bPCuG+Ynhz2mk3jg2X kNqjxDQmyw/nfM6e9HXlfGx9u5EP3IE3bBRi/htu9kyo6FEI4v+ZUElQvlZkno3FsoQg Myd8oJRfQosWQUWmf/rB5XwTkARlxtshYVoQM0dgZnhyrhS8YcV6LMk+g+vpsy0oECon Nmqg== X-Gm-Message-State: AOAM533XtGf4MPEw5897aBfbSK4CnsbKfMU99Bk+jOnvBJMC+xWs+YMq 98VHI8F8eL8SdNM8y4LWAkFuXHzblxRfzg== X-Google-Smtp-Source: ABdhPJz30DnK+1zUeIUq8321WJagFKNs0zMgU8nOXFcP7jP1dfyufZAD8B8GuiQID3n+yhby4j0vww== X-Received: by 2002:a37:e86:: with SMTP id 128mr33927052qko.314.1596059513470; Wed, 29 Jul 2020 14:51:53 -0700 (PDT) Received: from localhost.localdomain ([189.216.105.24]) by smtp.gmail.com with ESMTPSA id n127sm2804165qke.29.2020.07.29.14.51.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jul 2020 14:51:53 -0700 (PDT) From: development@efficientek.com To: grub-devel@gnu.org Cc: Glenn Washburn , Daniel Kiper , Patrick Steinhardt Subject: [PATCH 07/17] cryptodisk, luks: Allow special processing for comparing UUIDs. Date: Wed, 29 Jul 2020 16:50:12 -0500 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=2607:f8b0:4864:20::744; envelope-from=development@efficientek.com; helo=mail-qk1-x744.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. 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: Wed, 29 Jul 2020 21:51:59 -0000 From: Glenn Washburn Create grub_uuidcasecmp to compare UUIDs in a case-insensitive manner and that ignores '-' characters. This is backwards compatible with the old LUKS1 code that stored and compared against UUIDs without dashes. However, the new LUKS2 code stores and compares UUIDs that contain dashes. Really, the UUID comparison shouldn't care about the dashes, as this change implements. Now your old scripts will continue to work with UUIDs without dashes, but you may choose to use UUIDs with dashes now too for both LUKS1 and LUKS2. Signed-off-by: Glenn Washburn --- grub-core/disk/cryptodisk.c | 4 ++-- grub-core/disk/luks.c | 20 ++++---------------- grub-core/disk/luks2.c | 2 +- include/grub/misc.h | 21 +++++++++++++++++++++ 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c index f6b6302e1..f460ab838 100644 --- a/grub-core/disk/cryptodisk.c +++ b/grub-core/disk/cryptodisk.c @@ -660,7 +660,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) == 0) break; } else @@ -897,7 +897,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) == 0) return dev; return NULL; } diff --git a/grub-core/disk/luks.c b/grub-core/disk/luks.c index 6ae162601..ea54a9d10 100644 --- a/grub-core/disk/luks.c +++ b/grub-core/disk/luks.c @@ -69,10 +69,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid, int check_boot) { 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,18 +92,9 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid, || grub_be_to_cpu16 (header.version) != 1) return NULL; - optr = uuid; - for (iptr = header.uuid; iptr < &header.uuid[ARRAY_SIZE (header.uuid)]; - iptr++) + if (check_uuid && grub_uuidcasecmp (check_uuid, header.uuid) != 0) { - if (*iptr != '-') - *optr++ = *iptr; - } - *optr = 0; - - if (check_uuid && grub_strcasecmp (check_uuid, uuid) != 0) - { - grub_dprintf ("luks", "%s != %s\n", uuid, check_uuid); + grub_dprintf ("luks", "%s != %s\n", header.uuid, check_uuid); return NULL; } @@ -125,7 +113,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid, newdev->source_disk = NULL; newdev->log_sector_size = 9; newdev->total_length = grub_disk_get_size (disk) - newdev->offset; - grub_memcpy (newdev->uuid, uuid, sizeof (newdev->uuid)); + grub_memcpy (newdev->uuid, header.uuid, sizeof (newdev->uuid)); newdev->modname = "luks"; /* Configure the hash used for the AF splitter and HMAC. */ @@ -145,7 +133,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid, 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 632309e3c..3c571b7fd 100644 --- a/grub-core/disk/luks2.c +++ b/grub-core/disk/luks2.c @@ -356,7 +356,7 @@ luks2_scan (grub_disk_t disk, const char *check_uuid, int check_boot) return NULL; } - if (check_uuid && grub_strcasecmp (check_uuid, header.uuid) != 0) + if (check_uuid && grub_uuidcasecmp (check_uuid, header.uuid) != 0) return NULL; cryptodisk = grub_zalloc (sizeof (*cryptodisk)); diff --git a/include/grub/misc.h b/include/grub/misc.h index b7ca6dd58..3f0f42c22 100644 --- a/include/grub/misc.h +++ b/include/grub/misc.h @@ -243,6 +243,27 @@ grub_strncasecmp (const char *s1, const char *s2, grub_size_t n) - (int) grub_tolower ((grub_uint8_t) *s2); } +static inline int +grub_uuidcasecmp (const char *uuid1, const char *uuid2) +{ + while (*uuid1 && *uuid2) + { + while (*uuid1 == '-') + uuid1++; + while (*uuid2 == '-') + uuid2++; + + if (grub_tolower (*uuid1) != grub_tolower (*uuid2)) + break; + + uuid1++; + uuid2++; + } + + return (int) grub_tolower ((grub_uint8_t) *uuid1) + - (int) grub_tolower ((grub_uint8_t) *uuid2); +} + /* * 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.25.1