]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
smb: client: make SHA-512 TFM ephemeral
authorEnzo Matsumiya <ematsumiya@suse.de>
Thu, 26 Sep 2024 17:46:16 +0000 (14:46 -0300)
committerSteve French <stfrench@microsoft.com>
Thu, 26 Sep 2024 23:15:19 +0000 (18:15 -0500)
The SHA-512 shash TFM is used only briefly during Session Setup stage,
when computing SMB 3.1.1 preauth hash.

There's no need to keep it allocated in servers' secmech the whole time,
so keep its lifetime inside smb311_update_preauth_hash().

This also makes smb311_crypto_shash_allocate() redundant, so expose
smb3_crypto_shash_allocate() and use that.

Signed-off-by: Enzo Matsumiya <ematsumiya@suse.de>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/cifsencrypt.c
fs/smb/client/cifsglob.h
fs/smb/client/sess.c
fs/smb/client/smb2misc.c
fs/smb/client/smb2proto.h
fs/smb/client/smb2transport.c

index 464e6ccdfa5f8f9e6d181eda8397a81da303a6f1..2d851f596a727ef5e4b426944b99f1bb4474d184 100644 (file)
@@ -700,7 +700,6 @@ cifs_crypto_secmech_release(struct TCP_Server_Info *server)
        cifs_free_hash(&server->secmech.aes_cmac);
        cifs_free_hash(&server->secmech.hmacsha256);
        cifs_free_hash(&server->secmech.md5);
-       cifs_free_hash(&server->secmech.sha512);
 
        if (!SERVER_IS_CHAN(server)) {
                if (server->secmech.enc) {
index da35c160e7dd43a48bbc5586239e16c4016b3f01..315aac5dec0515930385353b72fbf597b71106b3 100644 (file)
@@ -180,7 +180,6 @@ struct session_key {
 struct cifs_secmech {
        struct shash_desc *md5; /* md5 hash function, for CIFS/SMB1 signatures */
        struct shash_desc *hmacsha256; /* hmac-sha256 hash function, for SMB2 signatures */
-       struct shash_desc *sha512; /* sha512 hash function, for SMB3.1.1 preauth hash */
        struct shash_desc *aes_cmac; /* block-cipher based MAC function, for SMB3 signatures */
 
        struct crypto_aead *enc; /* smb3 encryption AEAD TFM (AES-CCM and AES-GCM) */
index 3216f786908fbb2ac8345cf5929fadf8ec6920d4..03c0b484a4b5ae289556934f53eea0b4fe2f5ef1 100644 (file)
@@ -624,7 +624,7 @@ cifs_ses_add_channel(struct cifs_ses *ses,
         * to sign packets before we generate the channel signing key
         * (we sign with the session key)
         */
-       rc = smb311_crypto_shash_allocate(chan->server);
+       rc = smb3_crypto_shash_allocate(chan->server);
        if (rc) {
                cifs_dbg(VFS, "%s: crypto alloc failed\n", __func__);
                mutex_unlock(&ses->session_mutex);
index f3c4b70b77b94f3797362ecc0fdb32608f87aea5..bdeb12ff53e3c0247a736e7b3aa9e03082395d76 100644 (file)
@@ -906,41 +906,41 @@ smb311_update_preauth_hash(struct cifs_ses *ses, struct TCP_Server_Info *server,
                || (hdr->Status !=
                    cpu_to_le32(NT_STATUS_MORE_PROCESSING_REQUIRED))))
                return 0;
-
 ok:
-       rc = smb311_crypto_shash_allocate(server);
-       if (rc)
+       rc = cifs_alloc_hash("sha512", &sha512);
+       if (rc) {
+               cifs_dbg(VFS, "%s: Could not allocate SHA512 shash, rc=%d\n", __func__, rc);
                return rc;
+       }
 
-       sha512 = server->secmech.sha512;
        rc = crypto_shash_init(sha512);
        if (rc) {
-               cifs_dbg(VFS, "%s: Could not init sha512 shash\n", __func__);
-               return rc;
+               cifs_dbg(VFS, "%s: Could not init SHA512 shash, rc=%d\n", __func__, rc);
+               goto err_free;
        }
 
        rc = crypto_shash_update(sha512, ses->preauth_sha_hash,
                                 SMB2_PREAUTH_HASH_SIZE);
        if (rc) {
-               cifs_dbg(VFS, "%s: Could not update sha512 shash\n", __func__);
-               return rc;
+               cifs_dbg(VFS, "%s: Could not update SHA512 shash, rc=%d\n", __func__, rc);
+               goto err_free;
        }
 
        for (i = 0; i < nvec; i++) {
                rc = crypto_shash_update(sha512, iov[i].iov_base, iov[i].iov_len);
                if (rc) {
-                       cifs_dbg(VFS, "%s: Could not update sha512 shash\n",
-                                __func__);
-                       return rc;
+                       cifs_dbg(VFS, "%s: Could not update SHA512 shash, rc=%d\n", __func__, rc);
+                       goto err_free;
                }
        }
 
        rc = crypto_shash_final(sha512, ses->preauth_sha_hash);
        if (rc) {
-               cifs_dbg(VFS, "%s: Could not finalize sha512 shash\n",
-                        __func__);
-               return rc;
+               cifs_dbg(VFS, "%s: Could not finalize SHA12 shash, rc=%d\n", __func__, rc);
+               goto err_free;
        }
+err_free:
+       cifs_free_hash(&sha512);
 
        return 0;
 }
index c7e1b149877a044df8a47569966dc34c59c183f3..56a896ff7cd9f33e2e165f0d762358cf85fb0836 100644 (file)
@@ -291,7 +291,7 @@ extern int smb2_validate_and_copy_iov(unsigned int offset,
 extern void smb2_copy_fs_info_to_kstatfs(
         struct smb2_fs_full_size_info *pfs_inf,
         struct kstatfs *kst);
-extern int smb311_crypto_shash_allocate(struct TCP_Server_Info *server);
+extern int smb3_crypto_shash_allocate(struct TCP_Server_Info *server);
 extern int smb311_update_preauth_hash(struct cifs_ses *ses,
                                      struct TCP_Server_Info *server,
                                      struct kvec *iov, int nvec);
index c8bf0000f73bdcd4329efa90e655c2618637f450..f7e04c40d22e0a5b9589d2e0a847bebcee77547e 100644 (file)
@@ -26,8 +26,7 @@
 #include "../common/smb2status.h"
 #include "smb2glob.h"
 
-static int
-smb3_crypto_shash_allocate(struct TCP_Server_Info *server)
+int smb3_crypto_shash_allocate(struct TCP_Server_Info *server)
 {
        struct cifs_secmech *p = &server->secmech;
        int rc;
@@ -46,33 +45,6 @@ err:
        return rc;
 }
 
-int
-smb311_crypto_shash_allocate(struct TCP_Server_Info *server)
-{
-       struct cifs_secmech *p = &server->secmech;
-       int rc = 0;
-
-       rc = cifs_alloc_hash("hmac(sha256)", &p->hmacsha256);
-       if (rc)
-               return rc;
-
-       rc = cifs_alloc_hash("cmac(aes)", &p->aes_cmac);
-       if (rc)
-               goto err;
-
-       rc = cifs_alloc_hash("sha512", &p->sha512);
-       if (rc)
-               goto err;
-
-       return 0;
-
-err:
-       cifs_free_hash(&p->aes_cmac);
-       cifs_free_hash(&p->hmacsha256);
-       return rc;
-}
-
-
 static
 int smb2_get_sign_key(__u64 ses_id, struct TCP_Server_Info *server, u8 *key)
 {