]> www.infradead.org Git - users/hch/misc.git/commitdiff
smb: client: Use MD5 library for SMB1 signature calculation
authorEric Biggers <ebiggers@kernel.org>
Sun, 12 Oct 2025 01:57:35 +0000 (18:57 -0700)
committerSteve French <stfrench@microsoft.com>
Thu, 16 Oct 2025 03:10:28 +0000 (22:10 -0500)
Convert cifs_calc_signature() to use the MD5 library instead of a "md5"
crypto_shash.  This is simpler and faster.  With the library there's no
need to allocate memory, no need to handle errors, and the MD5 code is
accessed directly without inefficient indirect calls and other
unnecessary API overhead.

To preserve the existing behavior of MD5 signature support being
disabled when the kernel is booted with "fips=1", make
cifs_calc_signature() check fips_enabled itself.  Previously it relied
on the error from cifs_alloc_hash("md5", &server->secmech.md5).

Reviewed-by: Stefan Metzmacher <metze@samba.org>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/cifsencrypt.c
fs/smb/client/cifsproto.h

index 9522088a1cfb72efa4c7ea7a3b2b5b5b931d9b54..80215ba7a5744638c13a647b7ea5215d6704441b 100644 (file)
 #include <linux/iov_iter.h>
 #include <crypto/aead.h>
 #include <crypto/arc4.h>
+#include <crypto/md5.h>
 #include <crypto/sha2.h>
 
 static int cifs_sig_update(struct cifs_calc_sig_ctx *ctx,
                           const u8 *data, size_t len)
 {
+       if (ctx->md5) {
+               md5_update(ctx->md5, data, len);
+               return 0;
+       }
        if (ctx->hmac) {
                hmac_sha256_update(ctx->hmac, data, len);
                return 0;
@@ -38,6 +43,10 @@ static int cifs_sig_update(struct cifs_calc_sig_ctx *ctx,
 
 static int cifs_sig_final(struct cifs_calc_sig_ctx *ctx, u8 *out)
 {
+       if (ctx->md5) {
+               md5_final(ctx->md5, out);
+               return 0;
+       }
        if (ctx->hmac) {
                hmac_sha256_final(ctx->hmac, out);
                return 0;
@@ -130,31 +139,22 @@ int __cifs_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server,
 static int cifs_calc_signature(struct smb_rqst *rqst,
                        struct TCP_Server_Info *server, char *signature)
 {
-       int rc;
+       struct md5_ctx ctx;
 
        if (!rqst->rq_iov || !signature || !server)
                return -EINVAL;
-
-       rc = cifs_alloc_hash("md5", &server->secmech.md5);
-       if (rc)
-               return -1;
-
-       rc = crypto_shash_init(server->secmech.md5);
-       if (rc) {
-               cifs_dbg(VFS, "%s: Could not init md5\n", __func__);
-               return rc;
+       if (fips_enabled) {
+               cifs_dbg(VFS,
+                        "MD5 signature support is disabled due to FIPS\n");
+               return -EOPNOTSUPP;
        }
 
-       rc = crypto_shash_update(server->secmech.md5,
-               server->session_key.response, server->session_key.len);
-       if (rc) {
-               cifs_dbg(VFS, "%s: Could not update with response\n", __func__);
-               return rc;
-       }
+       md5_init(&ctx);
+       md5_update(&ctx, server->session_key.response, server->session_key.len);
 
        return __cifs_calc_signature(
                rqst, server, signature,
-               &(struct cifs_calc_sig_ctx){ .shash = server->secmech.md5 });
+               &(struct cifs_calc_sig_ctx){ .md5 = &ctx });
 }
 
 /* must be called with server->srv_mutex held */
index 3bb74eea0e4ff01e7b302840f78822a2ae1a39a8..4976be2c47c14aa606e9c5cc8103a7303f4c6108 100644 (file)
@@ -633,6 +633,7 @@ int cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
                           const unsigned char *path, char *pbuf,
                           unsigned int *pbytes_written);
 struct cifs_calc_sig_ctx {
+       struct md5_ctx *md5;
        struct hmac_sha256_ctx *hmac;
        struct shash_desc *shash;
 };