]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
measure: generate a more useful error in case SHA1 support is disabled by distro
authorLennart Poettering <lennart@poettering.net>
Mon, 2 Jun 2025 09:49:33 +0000 (11:49 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 3 Jun 2025 14:12:45 +0000 (16:12 +0200)
Fixes: #36743
man/systemd-measure.xml
src/measure/measure-tool.c
src/shared/openssl-util.c

index 014769f921796ef776934fd3c2ab9fcd427f9cfe..c144eda064443d29f75b5573e2db3ee3f3e61bc6 100644 (file)
         specified, defaults to the four banks <literal>sha1</literal>, <literal>sha256</literal>,
         <literal>sha384</literal>, <literal>sha512</literal>.</para>
 
+        <para>Note that some operating systems disable support for SHA1-based signatures, in which case this
+        operation will fail. Please consult your OS' documentation for details on how to override the OS
+        security policy around this.</para>
+
         <xi:include href="version-info.xml" xpointer="v252"/></listitem>
       </varlistentry>
 
index b7cb216c8ff795ae6c222e0afa9fb20281837a84..0d5ceb9faff57294092397bd4302df1bd8ec549d 100644 (file)
@@ -952,8 +952,10 @@ static int build_policy_digest(bool sign) {
                         size_t ss = 0;
                         if (privkey) {
                                 r = digest_and_sign(p->md, privkey, pcr_policy_digest.buffer, pcr_policy_digest.size, &sig, &ss);
+                                if (r == -EADDRNOTAVAIL)
+                                        return log_error_errno(r, "Hash algorithm '%s' not available while signing. (Maybe OS security policy disables this algorithm?)", EVP_MD_name(p->md));
                                 if (r < 0)
-                                        return log_error_errno(r, "Failed to sign PCR policy: %m");
+                                        return log_error_errno(r, "Failed to sign PCR policy with hash algorithm '%s': %m", EVP_MD_name(p->md));
                         }
 
                         _cleanup_free_ void *pubkey_fp = NULL;
index 656278b52b243029ae21bc5db5b468d90b6016c8..180d6f202f3fb9d9a6baa81e8844ceaaa8e529c5 100644 (file)
@@ -1082,6 +1082,8 @@ int digest_and_sign(
                 const void *data, size_t size,
                 void **ret, size_t *ret_size) {
 
+        int r;
+
         assert(privkey);
         assert(ret);
         assert(ret_size);
@@ -1099,8 +1101,13 @@ int digest_and_sign(
         if (!mdctx)
                 return log_openssl_errors("Failed to create new EVP_MD_CTX");
 
-        if (EVP_DigestSignInit(mdctx, NULL, md, NULL, privkey) != 1)
-                return log_openssl_errors("Failed to initialize signature context");
+        if (EVP_DigestSignInit(mdctx, NULL, md, NULL, privkey) != 1) {
+                /* Distro security policies often disable support for SHA-1. Let's return a recognizable
+                 * error for that case. */
+                bool invalid_digest = ERR_GET_REASON(ERR_peek_last_error()) == EVP_R_INVALID_DIGEST;
+                r = log_openssl_errors("Failed to initialize signature context");
+                return invalid_digest ? -EADDRNOTAVAIL : r;
+}
 
         /* Determine signature size */
         size_t ss;