mokutil/0005-mokutil-introduce-is-sb-enabled-parameter.patch
Leo Sandoval 853ac02b9c Better return codes
Introduce --is-sb-enabled parameter and better return codes. Also show
help on unsupported systems.

Resolves: #RHEL-90836
Resolves: #RHEL-90839
Signed-off-by: Leo Sandoval <lsandova@redhat.com>
2025-05-12 12:34:01 -06:00

139 lines
4.2 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Leo Sandoval <lsandova@redhat.com>
Date: Fri, 25 Apr 2025 13:07:10 -0600
Subject: [PATCH] mokutil: introduce --is-sb-enabled parameter
The result would be 0 if SB is enable, 1 otherwise (or -1 in case of
error). This is a different outcome when using --sb-state, where it
returns 0 no matter the SB status (or -1 in case of error).
Signed-off-by: Leo Sandoval <lsandova@redhat.com>
---
man/mokutil.1 | 5 +++++
src/mokutil.c | 30 ++++++++++++++++++++++++++++--
2 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/man/mokutil.1 b/man/mokutil.1
index ccb285c..6b30610 100644
--- a/man/mokutil.1
+++ b/man/mokutil.1
@@ -40,6 +40,8 @@ mokutil \- utility to manipulate machine owner keys
.br
\fBmokutil\fR [--sb-state]
.br
+\fBmokutil\fR [--is-sb-enabled]
+.br
\fBmokutil\fR [--test-key \fIkeyfile\fR | -t \fIkeyfile\fR]
([--mokx | -X] | [--ca-check] | [--ignore-keyring])
.br
@@ -133,6 +135,9 @@ Enable the validation process in shim
\fB--sb-state\fR
Show SecureBoot State
.TP
+\fB--is-sb-enabled\fR
+Indicates if SecureBoot is enabled
+.TP
\fB-t, --test-key\fR
Test if the key is enrolled or not
.TP
diff --git a/src/mokutil.c b/src/mokutil.c
index e40579b..918ca06 100644
--- a/src/mokutil.c
+++ b/src/mokutil.c
@@ -89,6 +89,7 @@
#define UNTRUST_MOK (1 << 28)
#define SET_SBAT (1 << 29)
#define SET_SSP (1 << 30)
+#define IS_SB_ENABLED (1 << 31)
#define DEFAULT_CRYPT_METHOD SHA512_BASED
#define DEFAULT_SALT_SIZE SHA512_SALT_MAX
@@ -129,6 +130,7 @@ print_help ()
printf (" --disable-validation\t\t\tDisable signature validation\n");
printf (" --enable-validation\t\t\tEnable signature validation\n");
printf (" --sb-state\t\t\t\tShow SecureBoot State\n");
+ printf (" --is-sb-enabled\t\t\tIndicates if SecureBoot is enabled or not\n");
printf (" --test-key, -t <der file>\t\tTest if the key is enrolled or not\n");
printf (" --reset\t\t\t\tReset MOK list\n");
printf (" --generate-hash[=password], -g\tGenerate the password hash\n");
@@ -1400,7 +1402,7 @@ enable_validation(void)
}
static int
-sb_state ()
+sb_state_internal ()
{
uint8_t *data = NULL;
size_t data_size;
@@ -1408,6 +1410,7 @@ sb_state ()
int32_t secureboot = -1;
int32_t setupmode = -1;
int32_t moksbstate = -1;
+ int ret = 0;
if (efi_get_variable (efi_guid_global, "SecureBoot", &data, &data_size,
&attributes) < 0) {
@@ -1453,17 +1456,34 @@ sb_state ()
if (secureboot == 1 && setupmode == 0) {
printf ("SecureBoot enabled\n");
+ ret = 0;
if (moksbstate == 1)
printf ("SecureBoot validation is disabled in shim\n");
} else if (secureboot == 0 || setupmode == 1) {
printf ("SecureBoot disabled\n");
+ ret = 1;
if (setupmode == 1)
printf ("Platform is in Setup Mode\n");
} else {
printf ("Cannot determine secure boot state.\n");
}
- return 0;
+ return ret;
+}
+
+static int
+sb_state ()
+{
+ int ret = sb_state_internal ();
+
+ /* in this case, ignore the ret value except on failure */
+ return (ret < 0)? ret: 0;
+}
+
+static int
+is_sb_enabled ()
+{
+ return sb_state_internal ();
}
static inline int
@@ -1855,6 +1875,7 @@ main (int argc, char *argv[])
{"disable-validation", no_argument, 0, 0 },
{"enable-validation", no_argument, 0, 0 },
{"sb-state", no_argument, 0, 0 },
+ {"is-sb-enabled", no_argument, 0, 0 },
{"test-key", required_argument, 0, 't'},
{"reset", no_argument, 0, 0 },
{"hash-file", required_argument, 0, 'f'},
@@ -1908,6 +1929,8 @@ main (int argc, char *argv[])
command |= ENABLE_VALIDATION;
} else if (strcmp (option, "sb-state") == 0) {
command |= SB_STATE;
+ } else if (strcmp (option, "is-sb-enabled") == 0) {
+ command |= IS_SB_ENABLED;
} else if (strcmp (option, "reset") == 0) {
command |= RESET;
} else if (strcmp (option, "ignore-db") == 0) {
@@ -2258,6 +2281,9 @@ main (int argc, char *argv[])
case SB_STATE:
ret = sb_state ();
break;
+ case IS_SB_ENABLED:
+ ret = is_sb_enabled ();
+ break;
case TEST_KEY:
ret = test_key (ENROLL_MOK, key_file);
break;