ksmbd: More crypto library conversions
Subsystems (3)
cover ksmbd: More crypto library conversions
This series converts fs/smb/server/ to access SHA-512, HMAC-SHA256, and HMAC-MD5 using the library APIs instead of crypto_shash.
This simplifies the code significantly. It also slightly improves performance, as it eliminates unnecessary overhead. I haven't done server-specific benchmarks, but you can get an idea of what to expect by looking at the numbers I gave for the similar client-side series:
https://lore.kernel.org/linux-cifs/20251014034230.GC2763@sol/
No change in behavior intended. All the crypto computations should be the same as before. I haven't tested this series (I did test the similar client-side series), but everything should still work.
Eric Biggers (3):
ksmbd: Use SHA-512 library for SMB3.1.1 preauth hash
ksmbd: Use HMAC-SHA256 library for message signing and key generation
ksmbd: Use HMAC-MD5 library for NTLMv2
fs/smb/server/Kconfig | 6 +- fs/smb/server/auth.c | 390 +++++++------------------------------ fs/smb/server/auth.h | 10 +- fs/smb/server/crypto_ctx.c | 24 --- fs/smb/server/crypto_ctx.h | 15 +- fs/smb/server/server.c | 4 - fs/smb/server/smb2pdu.c | 26 +-- fs/smb/server/smb_common.h | 2 +- 8 files changed, 87 insertions(+), 390 deletions(-)
base-commit: 3a8660878839faadb4f1a6dd72c3179c1df56787
Signature · 1 line
2.51.0
PATCH 1/3 ksmbd: Use SHA-512 library for SMB3.1.1 preauth hash
Convert ksmbd_gen_preauth_integrity_hash() to use the SHA-512 library instead of a "sha512" crypto_shash. This is simpler and faster. With the library there's no need to allocate memory, no need to handle errors, and the SHA-512 code is accessed directly without inefficient indirect calls and other unnecessary API overhead.
--- fs/smb/server/Kconfig | 2 +- fs/smb/server/auth.c | 41 +++++++------------------------------- fs/smb/server/crypto_ctx.c | 8 -------- fs/smb/server/crypto_ctx.h | 4 ---- fs/smb/server/server.c | 1 - 5 files changed, 8 insertions(+), 48 deletions(-)
fs/smb/server/Kconfig +1 -1
@@ -11,13 +11,13 @@ config SMB_SERVER select CRYPTO_HMAC select CRYPTO_ECB select CRYPTO_LIB_ARC4 select CRYPTO_LIB_DES select CRYPTO_LIB_SHA256 + select CRYPTO_LIB_SHA512 select CRYPTO_SHA256 select CRYPTO_CMAC - select CRYPTO_SHA512 select CRYPTO_AEAD2 select CRYPTO_CCM select CRYPTO_GCM select ASN1 select OID_REGISTRY
fs/smb/server/auth.c +7 -34
69 lines not on this page · raw message
fs/smb/server/crypto_ctx.c +0 -8
@@ -73,13 +73,10 @@ static struct shash_desc *alloc_shash_desc(int id) tfm =crypto_alloc_shash ("hmac(sha256)" ,0 ,0 );break ;case CRYPTO_SHASH_CMACAES : tfm =crypto_alloc_shash ("cmac(aes)" ,0 ,0 );break ; -case CRYPTO_SHASH_SHA512 : - tfm =crypto_alloc_shash ("sha512" ,0 ,0 ); -break ;default :return NULL ; }if (IS_ERR (tfm))
@@ -193,15 +190,10 @@ struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_hmacsha256(void)struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_cmacaes (void ) {return ____crypto_shash_ctx_find (CRYPTO_SHASH_CMACAES ); } -struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_sha512 (void ) -{ -return ____crypto_shash_ctx_find (CRYPTO_SHASH_SHA512 ); -} -static struct ksmbd_crypto_ctx *____crypto_aead_ctx_find (int id) {struct ksmbd_crypto_ctx *ctx;if (id >=CRYPTO_AEAD_MAX )
fs/smb/server/crypto_ctx.h +0 -4
@@ -11,11 +11,10 @@enum {CRYPTO_SHASH_HMACMD5 =0 ,CRYPTO_SHASH_HMACSHA256 ,CRYPTO_SHASH_CMACAES , -CRYPTO_SHASH_SHA512 ,CRYPTO_SHASH_MAX , };enum {CRYPTO_AEAD_AES_GCM =16 ,
@@ -36,26 +35,23 @@ struct ksmbd_crypto_ctx { };#define CRYPTO_HMACMD5 (c) ((c)->desc[CRYPTO_SHASH_HMACMD5])#define CRYPTO_HMACSHA256 (c) ((c)->desc[CRYPTO_SHASH_HMACSHA256])#define CRYPTO_CMACAES (c) ((c)->desc[CRYPTO_SHASH_CMACAES]) -#define CRYPTO_SHA512 (c) ((c)->desc[CRYPTO_SHASH_SHA512])#define CRYPTO_HMACMD5_TFM (c) ((c)->desc[CRYPTO_SHASH_HMACMD5]->tfm)#define CRYPTO_HMACSHA256_TFM (c)\ ((c)->desc[CRYPTO_SHASH_HMACSHA256]->tfm)#define CRYPTO_CMACAES_TFM (c) ((c)->desc[CRYPTO_SHASH_CMACAES]->tfm) -#define CRYPTO_SHA512_TFM (c) ((c)->desc[CRYPTO_SHASH_SHA512]->tfm)#define CRYPTO_GCM (c) ((c)->ccmaes[CRYPTO_AEAD_AES_GCM])#define CRYPTO_CCM (c) ((c)->ccmaes[CRYPTO_AEAD_AES_CCM])void ksmbd_release_crypto_ctx (struct ksmbd_crypto_ctx *ctx);struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_hmacmd5 (void );struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_hmacsha256 (void );struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_cmacaes (void ); -struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_sha512 (void );struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_gcm (void );struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_ccm (void );void ksmbd_crypto_destroy (void );int ksmbd_crypto_create (void );
fs/smb/server/server.c +0 -1
@@ -626,11 +626,10 @@ MODULE_SOFTDEP("pre: hmac");MODULE_SOFTDEP ("pre: md5" );MODULE_SOFTDEP ("pre: nls" );MODULE_SOFTDEP ("pre: aes" );MODULE_SOFTDEP ("pre: cmac" );MODULE_SOFTDEP ("pre: sha256" ); -MODULE_SOFTDEP ("pre: sha512" );MODULE_SOFTDEP ("pre: aead2" );MODULE_SOFTDEP ("pre: ccm" );MODULE_SOFTDEP ("pre: gcm" );module_init (ksmbd_server_init)module_exit (ksmbd_server_exit)
Signature · 1 line
2.51.0
PATCH 2/3 ksmbd: Use HMAC-SHA256 library for message signing and key generation
In reply to Eric BiggersConvert ksmbd_sign_smb2_pdu() and generate_key() to use the HMAC-SHA256 library instead of a "hmac(sha256)" crypto_shash. This is simpler and faster. With the library there's no need to allocate memory, no need to handle errors, and the HMAC-SHA256 code is accessed directly without inefficient indirect calls and other unnecessary API overhead.
--- fs/smb/server/Kconfig | 1 - fs/smb/server/auth.c | 176 ++++++++----------------------------- fs/smb/server/auth.h | 10 +-- fs/smb/server/crypto_ctx.c | 8 -- fs/smb/server/crypto_ctx.h | 5 -- fs/smb/server/server.c | 1 - fs/smb/server/smb2pdu.c | 26 ++---- fs/smb/server/smb_common.h | 2 +- 8 files changed, 52 insertions(+), 177 deletions(-)
fs/smb/server/Kconfig +0 -1
@@ -12,11 +12,10 @@ config SMB_SERVER select CRYPTO_ECB select CRYPTO_LIB_ARC4 select CRYPTO_LIB_DES select CRYPTO_LIB_SHA256 select CRYPTO_LIB_SHA512 - select CRYPTO_SHA256 select CRYPTO_CMAC select CRYPTO_AEAD2 select CRYPTO_CCM select CRYPTO_GCM select ASN1
fs/smb/server/auth.c +39 -137
273 lines not on this page · raw message
fs/smb/server/auth.h +5 -5
@@ -50,20 +50,20 @@ int ksmbd_decode_ntlmssp_neg_blob(struct negotiate_message *negblob,unsigned int ksmbd_build_ntlmssp_challenge_blob (struct challenge_message *chgblob,struct ksmbd_conn *conn);int ksmbd_krb5_authenticate (struct ksmbd_session *sess,char *in_blob,int in_len,char *out_blob,int *out_len); -int ksmbd_sign_smb2_pdu (struct ksmbd_conn *conn,char *key,struct kvec *iov, -int n_vec,char *sig); +void ksmbd_sign_smb2_pdu (struct ksmbd_conn *conn,char *key,struct kvec *iov, +int n_vec,char *sig);int ksmbd_sign_smb3_pdu (struct ksmbd_conn *conn,char *key,struct kvec *iov,int n_vec,char *sig);int ksmbd_gen_smb30_signingkey (struct ksmbd_session *sess,struct ksmbd_conn *conn);int ksmbd_gen_smb311_signingkey (struct ksmbd_session *sess,struct ksmbd_conn *conn); -int ksmbd_gen_smb30_encryptionkey (struct ksmbd_conn *conn, -struct ksmbd_session *sess); -int ksmbd_gen_smb311_encryptionkey (struct ksmbd_conn *conn, +void ksmbd_gen_smb30_encryptionkey (struct ksmbd_conn *conn,struct ksmbd_session *sess); +void ksmbd_gen_smb311_encryptionkey (struct ksmbd_conn *conn, +struct ksmbd_session *sess);int ksmbd_gen_preauth_integrity_hash (struct ksmbd_conn *conn,char *buf,__u8 *pi_hash);#endif
fs/smb/server/crypto_ctx.c +0 -8
@@ -67,13 +67,10 @@ static struct shash_desc *alloc_shash_desc(int id)switch (id) {case CRYPTO_SHASH_HMACMD5 : tfm =crypto_alloc_shash ("hmac(md5)" ,0 ,0 );break ; -case CRYPTO_SHASH_HMACSHA256 : - tfm =crypto_alloc_shash ("hmac(sha256)" ,0 ,0 ); -break ;case CRYPTO_SHASH_CMACAES : tfm =crypto_alloc_shash ("cmac(aes)" ,0 ,0 );break ;default :return NULL ;
@@ -180,15 +177,10 @@ static struct ksmbd_crypto_ctx *____crypto_shash_ctx_find(int id)struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_hmacmd5 (void ) {return ____crypto_shash_ctx_find (CRYPTO_SHASH_HMACMD5 ); } -struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_hmacsha256 (void ) -{ -return ____crypto_shash_ctx_find (CRYPTO_SHASH_HMACSHA256 ); -} -struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_cmacaes (void ) {return ____crypto_shash_ctx_find (CRYPTO_SHASH_CMACAES ); }
fs/smb/server/crypto_ctx.h +0 -5
@@ -9,11 +9,10 @@#include <crypto/hash.h> #include <crypto/aead.h> enum {CRYPTO_SHASH_HMACMD5 =0 , -CRYPTO_SHASH_HMACSHA256 ,CRYPTO_SHASH_CMACAES ,CRYPTO_SHASH_MAX , };enum {
@@ -33,24 +32,20 @@ struct ksmbd_crypto_ctx {struct shash_desc *desc[CRYPTO_SHASH_MAX ];struct crypto_aead *ccmaes[CRYPTO_AEAD_MAX ]; };#define CRYPTO_HMACMD5 (c) ((c)->desc[CRYPTO_SHASH_HMACMD5]) -#define CRYPTO_HMACSHA256 (c) ((c)->desc[CRYPTO_SHASH_HMACSHA256])#define CRYPTO_CMACAES (c) ((c)->desc[CRYPTO_SHASH_CMACAES])#define CRYPTO_HMACMD5_TFM (c) ((c)->desc[CRYPTO_SHASH_HMACMD5]->tfm) -#define CRYPTO_HMACSHA256_TFM (c)\ - ((c)->desc[CRYPTO_SHASH_HMACSHA256]->tfm)#define CRYPTO_CMACAES_TFM (c) ((c)->desc[CRYPTO_SHASH_CMACAES]->tfm)#define CRYPTO_GCM (c) ((c)->ccmaes[CRYPTO_AEAD_AES_GCM])#define CRYPTO_CCM (c) ((c)->ccmaes[CRYPTO_AEAD_AES_CCM])void ksmbd_release_crypto_ctx (struct ksmbd_crypto_ctx *ctx);struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_hmacmd5 (void ); -struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_hmacsha256 (void );struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_cmacaes (void );struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_gcm (void );struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_ccm (void );void ksmbd_crypto_destroy (void );int ksmbd_crypto_create (void );
fs/smb/server/server.c +0 -1
@@ -625,11 +625,10 @@ MODULE_SOFTDEP("pre: ecb");MODULE_SOFTDEP ("pre: hmac" );MODULE_SOFTDEP ("pre: md5" );MODULE_SOFTDEP ("pre: nls" );MODULE_SOFTDEP ("pre: aes" );MODULE_SOFTDEP ("pre: cmac" ); -MODULE_SOFTDEP ("pre: sha256" );MODULE_SOFTDEP ("pre: aead2" );MODULE_SOFTDEP ("pre: ccm" );MODULE_SOFTDEP ("pre: gcm" );module_init (ksmbd_server_init)module_exit (ksmbd_server_exit)
fs/smb/server/smb2pdu.c +7 -19
@@ -1536,16 +1536,11 @@ static int ntlm_authenticate(struct ksmbd_work *work, (req->SecurityMode & SMB2_NEGOTIATE_SIGNING_REQUIRED)) sess->sign = true;if (smb3_encryption_negotiated (conn) && !(req->Flags &SMB2_SESSION_REQ_FLAG_BINDING )) { - rc = conn->ops->generate_encryptionkey (conn, sess); -if (rc) { -ksmbd_debug (SMB , -"SMB3 encryption key generation failed\n" ); -return -EINVAL ; - } + conn->ops->generate_encryptionkey (conn, sess); sess->enc = true;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION ) rsp->SessionFlags =SMB2_SESSION_FLAG_ENCRYPT_DATA_LE ;/* * signing is disable if encryption is enable
@@ -1638,16 +1633,11 @@ static int krb5_authenticate(struct ksmbd_work *work, (req->SecurityMode & SMB2_NEGOTIATE_SIGNING_REQUIRED)) sess->sign = true;if (smb3_encryption_negotiated (conn) && !(req->Flags &SMB2_SESSION_REQ_FLAG_BINDING )) { - retval = conn->ops->generate_encryptionkey (conn, sess); -if (retval) { -ksmbd_debug (SMB , -"SMB3 encryption key generation failed\n" ); -return -EINVAL ; - } + conn->ops->generate_encryptionkey (conn, sess); sess->enc = true;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION ) rsp->SessionFlags =SMB2_SESSION_FLAG_ENCRYPT_DATA_LE ; sess->sign = false; }
@@ -8850,13 +8840,12 @@ int smb2_check_sign_req(struct ksmbd_work *work)memset (hdr->Signature,0 ,SMB2_SIGNATURE_SIZE ); iov[0 ].iov_base = (char *)&hdr->ProtocolId; iov[0 ].iov_len = len; -if (ksmbd_sign_smb2_pdu (work->conn, work->sess->sess_key, iov,1 , - signature)) -return 0 ; +ksmbd_sign_smb2_pdu (work->conn, work->sess->sess_key, iov,1 , + signature);if (memcmp (signature, signature_req,SMB2_SIGNATURE_SIZE )) {pr_err ("bad smb2 signature\n" );return 0 ; }
@@ -8876,22 +8865,21 @@ void smb2_set_sign_rsp(struct ksmbd_work *work)struct kvec *iov;int n_vec =1 ; hdr =ksmbd_resp_buf_curr (work); hdr->Flags |=SMB2_FLAGS_SIGNED ; -memset (hdr->Signature,0 ,SMB2_SIGNATURE_SIZE );if (hdr->Command ==SMB2_READ ) { iov = &work->iov[work->iov_idx -1 ]; n_vec++; }else { iov = &work->iov[work->iov_idx]; } -if (!ksmbd_sign_smb2_pdu (work->conn, work->sess->sess_key, iov, n_vec, - signature)) -memcpy (hdr->Signature, signature,SMB2_SIGNATURE_SIZE ); +ksmbd_sign_smb2_pdu (work->conn, work->sess->sess_key, iov, n_vec, + signature); +memcpy (hdr->Signature, signature,SMB2_SIGNATURE_SIZE ); }/** * smb3_check_sign_req() - handler for req packet sign processing * @work: smb work containing notify command buffer
fs/smb/server/smb_common.h +1 -1
@@ -407,11 +407,11 @@ struct smb_version_ops {int (*get_ksmbd_tcon)(struct ksmbd_work *work);bool (*is_sign_req)(struct ksmbd_work *work,unsigned int command);int (*check_sign_req)(struct ksmbd_work *work);void (*set_sign_rsp)(struct ksmbd_work *work);int (*generate_signingkey)(struct ksmbd_session *sess,struct ksmbd_conn *conn); -int (*generate_encryptionkey)(struct ksmbd_conn *conn,struct ksmbd_session *sess); +void (*generate_encryptionkey)(struct ksmbd_conn *conn,struct ksmbd_session *sess);bool (*is_transform_hdr)(void *buf);int (*decrypt_req)(struct ksmbd_work *work);int (*encrypt_resp)(struct ksmbd_work *work); };
Signature · 1 line
2.51.0
Namjae Jeon
maintainerRe: [PATCH 2/3] ksmbd: Use HMAC-SHA256 library for message signing and key generation
[snip]
fs/smb/server/smb2pdu.c void smb2_set_sign_rsp(struct ksmbd_work *work) · line 8881
Quoted 7 lines
fs/smb/server/smb2pdu.c +0
-1@@ -8876,22 +8865,21 @@ void smb2_set_sign_rsp(struct ksmbd_work *work)struct kvec *iov;int n_vec =1 ; hdr =ksmbd_resp_buf_curr (work); hdr->Flags |=SMB2_FLAGS_SIGNED ; -memset (hdr->Signature,0 ,SMB2_SIGNATURE_SIZE );
By deleting this line, the following error occurs.
[162118.260693] CIFS: VFS: sign fail cmd 0x3 message id 0x3 [162118.260707] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.261473] CIFS: VFS: sign fail cmd 0xb message id 0x4 [162118.261482] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.262437] CIFS: VFS: sign fail cmd 0x3 message id 0x5 [162118.262449] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.262892] CIFS: VFS: sign fail cmd 0x5 message id 0x6 [162118.262900] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.263301] CIFS: VFS: sign fail cmd 0x10 message id 0x7 [162118.263314] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.263724] CIFS: VFS: sign fail cmd 0x10 message id 0x8 [162118.263736] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.264142] CIFS: VFS: sign fail cmd 0x6 message id 0x9 [162118.264154] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.264591] CIFS: VFS: sign fail cmd 0x5 message id 0xa [162118.264603] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.264912] CIFS: VFS: sign fail cmd 0x6 message id 0xb [162118.264925] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.265244] CIFS: VFS: sign fail cmd 0x5 message id 0xc [162118.265257] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162119.831575] CIFS: VFS: \\10.177.110.57\homes2 SMB signature
verification returned error = -13
I have directly restored this line manually and then applied this patch to #ksmbd-for-next-next.
Thanks!
Quoted 39 lines
fs/smb/server/smb2pdu.c +3
-3if (hdr->Command ==SMB2_READ ) { iov = &work->iov[work->iov_idx -1 ]; n_vec++; }else { iov = &work->iov[work->iov_idx]; } -if (!ksmbd_sign_smb2_pdu (work->conn, work->sess->sess_key, iov, n_vec, - signature)) -memcpy (hdr->Signature, signature,SMB2_SIGNATURE_SIZE ); +ksmbd_sign_smb2_pdu (work->conn, work->sess->sess_key, iov, n_vec, + signature); +memcpy (hdr->Signature, signature,SMB2_SIGNATURE_SIZE ); }/** * smb3_check_sign_req() - handler for req packet sign processing * @work: smb work containing notify command buffer fs/smb/server/smb_common.h +1
-2@@ -407,11 +407,11 @@ struct smb_version_ops {int (*get_ksmbd_tcon)(struct ksmbd_work *work);bool (*is_sign_req)(struct ksmbd_work *work,unsigned int command);int (*check_sign_req)(struct ksmbd_work *work);void (*set_sign_rsp)(struct ksmbd_work *work);int (*generate_signingkey)(struct ksmbd_session *sess,struct ksmbd_conn *conn); -int (*generate_encryptionkey)(struct ksmbd_conn *conn,struct ksmbd_session *sess); +void (*generate_encryptionkey)(struct ksmbd_conn *conn,struct ksmbd_session *sess);bool (*is_transform_hdr)(void *buf);int (*decrypt_req)(struct ksmbd_work *work);int (*encrypt_resp)(struct ksmbd_work *work); }; --2.51.0
Re: [PATCH 2/3] ksmbd: Use HMAC-SHA256 library for message signing and key generation
Quoted 41 lines · Namjae Jeon
[snip]
fs/smb/server/smb2pdu.c void smb2_set_sign_rsp(struct ksmbd_work *work) · line 8881
Quoted 7 lines
fs/smb/server/smb2pdu.c +0
-1@@ -8876,22 +8865,21 @@ void smb2_set_sign_rsp(struct ksmbd_work *work)struct kvec *iov;int n_vec =1 ; hdr =ksmbd_resp_buf_curr (work); hdr->Flags |=SMB2_FLAGS_SIGNED ; -memset (hdr->Signature,0 ,SMB2_SIGNATURE_SIZE );By deleting this line, the following error occurs.
[162118.260693] CIFS: VFS: sign fail cmd 0x3 message id 0x3 [162118.260707] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.261473] CIFS: VFS: sign fail cmd 0xb message id 0x4 [162118.261482] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.262437] CIFS: VFS: sign fail cmd 0x3 message id 0x5 [162118.262449] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.262892] CIFS: VFS: sign fail cmd 0x5 message id 0x6 [162118.262900] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.263301] CIFS: VFS: sign fail cmd 0x10 message id 0x7 [162118.263314] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.263724] CIFS: VFS: sign fail cmd 0x10 message id 0x8 [162118.263736] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.264142] CIFS: VFS: sign fail cmd 0x6 message id 0x9 [162118.264154] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.264591] CIFS: VFS: sign fail cmd 0x5 message id 0xa [162118.264603] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.264912] CIFS: VFS: sign fail cmd 0x6 message id 0xb [162118.264925] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162118.265244] CIFS: VFS: sign fail cmd 0x5 message id 0xc [162118.265257] CIFS: VFS: \\10.177.110.57 SMB signature verification returned error = -13 [162119.831575] CIFS: VFS: \\10.177.110.57\homes2 SMB signature
Quoted 5 lines
verification returned error = -13
I have directly restored this line manually and then applied this patch to #ksmbd-for-next-next.
Thanks!
Thanks for catching that! It looked like zeroizing 'hdr->Signature' was only needed for when ksmbd_sign_smb2_pdu() failed. But it must be part of the HMAC input data as well, i.e. 'hdr' must point to the same memory as one of the iovecs. So restoring the line is fine. Thanks,
- Eric
PATCH 3/3 ksmbd: Use HMAC-MD5 library for NTLMv2
In reply to Eric BiggersFor the HMAC-MD5 computations in NTLMv2, use the HMAC-MD5 library instead of a "hmac(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 HMAC-MD5 code is accessed directly without inefficient indirect calls and other unnecessary API overhead.
To preserve the existing behavior of NTLMv2 support being disabled when the kernel is booted with "fips=1", make ksmbd_auth_ntlmv2() check fips_enabled itself. Previously it relied on the error from crypto_alloc_shash("hmac(md5)") being bubbled up. I don't know for sure that this is actually needed, but this preserves the existing behavior.
--- fs/smb/server/Kconfig | 3 +- fs/smb/server/auth.c | 173 ++++++------------------------------- fs/smb/server/crypto_ctx.c | 8 -- fs/smb/server/crypto_ctx.h | 6 +- fs/smb/server/server.c | 2 - 5 files changed, 27 insertions(+), 165 deletions(-)
fs/smb/server/Kconfig +1 -2
@@ -5,15 +5,14 @@ config SMB_SERVER depends on FILE_LOCKING select NLS select NLS_UTF8 select NLS_UCS2_UTILS select CRYPTO - select CRYPTO_MD5 - select CRYPTO_HMAC select CRYPTO_ECB select CRYPTO_LIB_ARC4 select CRYPTO_LIB_DES + select CRYPTO_LIB_MD5 select CRYPTO_LIB_SHA256 select CRYPTO_LIB_SHA512 select CRYPTO_CMAC select CRYPTO_AEAD2 select CRYPTO_CCM
fs/smb/server/auth.c +25 -148
243 lines not on this page · raw message
fs/smb/server/crypto_ctx.c +0 -8
@@ -64,13 +64,10 @@ static struct shash_desc *alloc_shash_desc(int id) {struct crypto_shash *tfm =NULL ;struct shash_desc *shash;switch (id) { -case CRYPTO_SHASH_HMACMD5 : - tfm =crypto_alloc_shash ("hmac(md5)" ,0 ,0 ); -break ;case CRYPTO_SHASH_CMACAES : tfm =crypto_alloc_shash ("cmac(aes)" ,0 ,0 );break ;default :return NULL ;
@@ -172,15 +169,10 @@ static struct ksmbd_crypto_ctx *____crypto_shash_ctx_find(int id)return ctx;ksmbd_release_crypto_ctx (ctx);return NULL ; } -struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_hmacmd5 (void ) -{ -return ____crypto_shash_ctx_find (CRYPTO_SHASH_HMACMD5 ); -} -struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_cmacaes (void ) {return ____crypto_shash_ctx_find (CRYPTO_SHASH_CMACAES ); }
fs/smb/server/crypto_ctx.h +1 -5
@@ -8,12 +8,11 @@#include <crypto/hash.h> #include <crypto/aead.h> enum { -CRYPTO_SHASH_HMACMD5 =0 , -CRYPTO_SHASH_CMACAES , +CRYPTO_SHASH_CMACAES =0 ,CRYPTO_SHASH_MAX , };enum {CRYPTO_AEAD_AES_GCM =16 ,
@@ -31,21 +30,18 @@ struct ksmbd_crypto_ctx {struct shash_desc *desc[CRYPTO_SHASH_MAX ];struct crypto_aead *ccmaes[CRYPTO_AEAD_MAX ]; }; -#define CRYPTO_HMACMD5 (c) ((c)->desc[CRYPTO_SHASH_HMACMD5])#define CRYPTO_CMACAES (c) ((c)->desc[CRYPTO_SHASH_CMACAES]) -#define CRYPTO_HMACMD5_TFM (c) ((c)->desc[CRYPTO_SHASH_HMACMD5]->tfm)#define CRYPTO_CMACAES_TFM (c) ((c)->desc[CRYPTO_SHASH_CMACAES]->tfm)#define CRYPTO_GCM (c) ((c)->ccmaes[CRYPTO_AEAD_AES_GCM])#define CRYPTO_CCM (c) ((c)->ccmaes[CRYPTO_AEAD_AES_CCM])void ksmbd_release_crypto_ctx (struct ksmbd_crypto_ctx *ctx); -struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_hmacmd5 (void );struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_cmacaes (void );struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_gcm (void );struct ksmbd_crypto_ctx *ksmbd_crypto_ctx_find_ccm (void );void ksmbd_crypto_destroy (void );int ksmbd_crypto_create (void );
fs/smb/server/server.c +0 -2
@@ -620,12 +620,10 @@ static void __exit ksmbd_server_exit(void)MODULE_AUTHOR ("Namjae Jeon <[email protected]>" );MODULE_DESCRIPTION ("Linux kernel CIFS/SMB SERVER" );MODULE_LICENSE ("GPL" );MODULE_SOFTDEP ("pre: ecb" ); -MODULE_SOFTDEP ("pre: hmac" ); -MODULE_SOFTDEP ("pre: md5" );MODULE_SOFTDEP ("pre: nls" );MODULE_SOFTDEP ("pre: aes" );MODULE_SOFTDEP ("pre: cmac" );MODULE_SOFTDEP ("pre: aead2" );MODULE_SOFTDEP ("pre: ccm" );
Signature · 1 line
2.51.0
cover ksmbd: More crypto library conversions
In reply to Eric BiggersAdding linux-cifs mailing lists for more visibility to these changes
---------- Forwarded message ---------
From: Eric Biggers <[email protected]>
Date: Tue, Oct 14, 2025 at 6:18 PM
Subject: [PATCH 0/3] ksmbd: More crypto library conversions
To: <[email protected]>, Namjae Jeon <[email protected]>, Steve French <[email protected]>
Cc: Sergey Senozhatsky <[email protected]>, Tom Talpey <[email protected]>, <[email protected]>, <[email protected]>, Eric Biggers <[email protected]>
This series converts fs/smb/server/ to access SHA-512, HMAC-SHA256, and HMAC-MD5 using the library APIs instead of crypto_shash.
This simplifies the code significantly. It also slightly improves performance, as it eliminates unnecessary overhead. I haven't done server-specific benchmarks, but you can get an idea of what to expect by looking at the numbers I gave for the similar client-side series:
https://lore.kernel.org/linux-cifs/20251014034230.GC2763@sol/
No change in behavior intended. All the crypto computations should be the same as before. I haven't tested this series (I did test the similar client-side series), but everything should still work.
Eric Biggers (3):
ksmbd: Use SHA-512 library for SMB3.1.1 preauth hash
ksmbd: Use HMAC-SHA256 library for message signing and key generation
ksmbd: Use HMAC-MD5 library for NTLMv2
fs/smb/server/Kconfig | 6 +- fs/smb/server/auth.c | 390 +++++++------------------------------ fs/smb/server/auth.h | 10 +- fs/smb/server/crypto_ctx.c | 24 --- fs/smb/server/crypto_ctx.h | 15 +- fs/smb/server/server.c | 4 - fs/smb/server/smb2pdu.c | 26 +-- fs/smb/server/smb_common.h | 2 +- 8 files changed, 87 insertions(+), 390 deletions(-)
base-commit: 3a8660878839faadb4f1a6dd72c3179c1df56787 --
2.51.0
Signature · 3 lines
Thanks, Steve
Quoted 10 lines · Eric Biggers
This series converts
fs/smb/server/to access SHA-512, HMAC-SHA256, and HMAC-MD5 using the library APIs instead ofcrypto_shash.This simplifies the code significantly. It also slightly improves performance, as it eliminates unnecessary overhead. I haven't done server-specific benchmarks, but you can get an idea of what to expect by looking at the numbers I gave for the similar client-side series:
https://lore.kernel.org/linux-cifs/20251014034230.GC2763@sol/
Quoted 8 lines
No change in behavior intended. All the crypto computations should be the same as before. I haven't tested this series (I did test the similar client-side series), but everything should still work.
Eric Biggers (3):
ksmbd: Use SHA-512 library for SMB3.1.1 preauth hash
ksmbd: Use HMAC-SHA256 library for message signing and key generation
ksmbd: Use HMAC-MD5 library for NTLMv2
Applied them to #ksmbd-for-next-next.
Thanks!
Quoted 16 lines
fs/smb/server/Kconfig | 6 +- fs/smb/server/auth.c | 390 +++++++------------------------------ fs/smb/server/auth.h | 10 +- fs/smb/server/crypto_ctx.c | 24 --- fs/smb/server/crypto_ctx.h | 15 +- fs/smb/server/server.c | 4 - fs/smb/server/smb2pdu.c | 26 +-- fs/smb/server/smb_common.h | 2 +- 8 files changed, 87 insertions(+), 390 deletions(-)base-commit:
3a8660878839faadb4f1a6dd72c3179c1df56787--
2.51.0