ksmbd: Use AES-CMAC library for SMB3 signature calculation
Subsystems (3)
PATCH v2 1/1 ksmbd: Use AES-CMAC library for SMB3 signature calculation
Now that AES-CMAC has a library API, convert ksmbd_sign_smb3_pdu() to use it instead of a "cmac(aes)" crypto_shash.
The result is simpler and faster code. With the library there's no need to dynamically allocate memory, no need to handle errors, and the AES-CMAC code is accessed directly without inefficient indirect calls and other unnecessary API overhead.
---
This patch was originally sent as patch 12 of the series
https://lore.kernel.org/r/[email protected]/
The only change from that version was adding tags and rebasing.
This is intended to be taken through the ksmbd tree, either 7.1 or 7.2 depending on maintainer preference.
fs/smb/server/Kconfig | 2 +- fs/smb/server/auth.c | 51 +++++++++------------------------ fs/smb/server/auth.h | 4 +-- fs/smb/server/crypto_ctx.c | 58 -------------------------------------- fs/smb/server/crypto_ctx.h | 12 -------- fs/smb/server/server.c | 1 - fs/smb/server/smb2pdu.c | 8 ++---- 7 files changed, 19 insertions(+), 117 deletions(-)
fs/smb/server/Kconfig +1 -1
@@ -5,17 +5,17 @@ config SMB_SERVER depends on FILE_LOCKING select NLS select NLS_UTF8 select NLS_UCS2_UTILS select CRYPTO + select CRYPTO_LIB_AES_CBC_MACS select CRYPTO_LIB_ARC4 select CRYPTO_LIB_DES select CRYPTO_LIB_MD5 select CRYPTO_LIB_SHA256 select CRYPTO_LIB_SHA512 select CRYPTO_LIB_UTILS - select CRYPTO_CMAC select CRYPTO_AEAD2 select CRYPTO_CCM select CRYPTO_GCM select ASN1 select OID_REGISTRY
fs/smb/server/auth.c +13 -38
75 lines not on this page · raw message
fs/smb/server/auth.h +2 -2
@@ -52,12 +52,12 @@ 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);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); +void 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); void ksmbd_gen_smb30_encryptionkey(struct ksmbd_conn *conn,
fs/smb/server/crypto_ctx.c +0 -58
92 lines not on this page · raw message
fs/smb/server/crypto_ctx.h +0 -12
@@ -4,40 +4,28 @@*/ #ifndef __CRYPTO_CTX_H__#define __CRYPTO_CTX_H__ -#include <crypto/hash.h> #include <crypto/aead.h> -enum { -CRYPTO_SHASH_CMACAES =0 , -CRYPTO_SHASH_MAX , -}; -enum {CRYPTO_AEAD_AES_GCM =16 ,CRYPTO_AEAD_AES_CCM ,CRYPTO_AEAD_MAX , };struct ksmbd_crypto_ctx {struct list_head list; -struct shash_desc *desc[CRYPTO_SHASH_MAX ];struct crypto_aead *ccmaes[CRYPTO_AEAD_MAX ]; }; -#define CRYPTO_CMACAES (c) ((c)->desc[CRYPTO_SHASH_CMACAES]) - -#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_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
@@ -629,11 +629,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: nls" );MODULE_SOFTDEP ("pre: aes" ); -MODULE_SOFTDEP ("pre: cmac" );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 +3 -5
@@ -9065,12 +9065,11 @@ int smb3_check_sign_req(struct ksmbd_work *work)memcpy (signature_req, hdr->Signature,SMB2_SIGNATURE_SIZE );memset (hdr->Signature,0 ,SMB2_SIGNATURE_SIZE ); iov[0 ].iov_base = (char *)&hdr->ProtocolId; iov[0 ].iov_len = len; -if (ksmbd_sign_smb3_pdu (conn, signing_key, iov,1 , signature)) -return 0 ; +ksmbd_sign_smb3_pdu (conn, signing_key, iov,1 , signature);if (crypto_memneq (signature, signature_req,SMB2_SIGNATURE_SIZE )) {pr_err ("bad smb2 signature\n" );return 0 ; }
@@ -9117,13 +9116,12 @@ void smb3_set_sign_rsp(struct ksmbd_work *work) n_vec++; }else { iov = &work->iov[work->iov_idx]; } -if (!ksmbd_sign_smb3_pdu (conn, signing_key, iov, n_vec, - signature)) -memcpy (hdr->Signature, signature,SMB2_SIGNATURE_SIZE ); +ksmbd_sign_smb3_pdu (conn, signing_key, iov, n_vec, signature); +memcpy (hdr->Signature, signature,SMB2_SIGNATURE_SIZE ); }/** * smb3_preauth_hash_rsp() - handler for computing preauth hash on response * @work: smb work containing response buffer
base-commit: 8541d8f725c673db3bd741947f27974358b2e163
Signature · 1 line
2.53.0
Quoted 4 lines · Eric Biggers
Now that AES-CMAC has a library API, convert
ksmbd_sign_smb3_pdu()to use it instead of a "cmac(aes)"crypto_shash.
Quoted 8 lines
The result is simpler and faster code. With the library there's no need to dynamically allocate memory, no need to handle errors, and the AES-CMAC code is accessed directly without inefficient indirect calls and other unnecessary API overhead.
Acked-by Namjae Jeon <[email protected]>Reviewed-by Ard Biesheuvel <[email protected]>Signed-off-by Eric Biggers <[email protected]>
Applied it to #ksmbd-for-next-next.
Thanks!