diff options
| author | Enzo Matsumiya <ematsumiya@suse.de> | 2024-11-14 14:44:41 -0300 |
|---|---|---|
| committer | Enzo Matsumiya <ematsumiya@suse.de> | 2024-11-14 15:54:45 -0300 |
| commit | 60eed99db98cb0138209a943d5b8c79af7f7481f (patch) | |
| tree | 3991fbd7f3e48c200c70586b5248660385775722 | |
| parent | 624c2965b0681d3c41a18067001972a6e69f1171 (diff) | |
| download | linux-60eed99db98cb0138209a943d5b8c79af7f7481f.tar.gz linux-60eed99db98cb0138209a943d5b8c79af7f7481f.tar.bz2 linux-60eed99db98cb0138209a943d5b8c79af7f7481f.zip | |
smb: client: remove ->calc_signature op
Make smb{2,3}_calc_signature() static as it's only called inside
smb2transport.c.
Signed-off-by: Enzo Matsumiya <ematsumiya@suse.de>
| -rw-r--r-- | fs/smb/client/cifsglob.h | 4 | ||||
| -rw-r--r-- | fs/smb/client/smb2ops.c | 5 | ||||
| -rw-r--r-- | fs/smb/client/smb2pdu.c | 19 | ||||
| -rw-r--r-- | fs/smb/client/smb2proto.h | 6 | ||||
| -rw-r--r-- | fs/smb/client/smb2transport.c | 55 |
5 files changed, 37 insertions, 52 deletions
diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 55656f25bde0..ca1b3739717c 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -298,10 +298,6 @@ struct smb_version_operations { /* query remote filesystem */ int (*queryfs)(const unsigned int, struct cifs_tcon *, const char *, struct cifs_sb_info *, struct kstatfs *); - int (*generate_signingkey)(struct cifs_ses *ses, - struct TCP_Server_Info *server); - int (*calc_signature)(struct smb_rqst *, struct TCP_Server_Info *, - bool allocate_crypto); }; struct smb_version_values { diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 838afc8add70..7837b95597f2 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -4994,7 +4994,6 @@ struct smb_version_operations smb21_operations = { .negotiate_rsize = smb2_negotiate_rsize, .qfs_tcon = smb2_qfs_tcon, .queryfs = smb2_queryfs, - .calc_signature = smb2_calc_signature, }; struct smb_version_operations smb30_operations = { @@ -5006,8 +5005,6 @@ struct smb_version_operations smb30_operations = { /* WSL tags introduced long after smb2.1, enable for SMB3, 3.11 only */ .close_getattr = smb2_close_getattr, .queryfs = smb2_queryfs, - .generate_signingkey = generate_smb30signingkey, - .calc_signature = smb3_calc_signature, }; struct smb_version_operations smb311_operations = { @@ -5019,8 +5016,6 @@ struct smb_version_operations smb311_operations = { .posix_mkdir = smb311_posix_mkdir, .close_getattr = smb2_close_getattr, .queryfs = smb311_queryfs, - .generate_signingkey = generate_smb311signingkey, - .calc_signature = smb3_calc_signature, }; struct smb_version_values smb21_values = { diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index 048b01c7f14f..6af0e0dc45ce 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -1574,15 +1574,18 @@ SMB2_sess_establish_session(struct SMB2_sess_data *sess_data) struct TCP_Server_Info *server = sess_data->server; cifs_server_lock(server); - if (server->ops->generate_signingkey) { - rc = server->ops->generate_signingkey(ses, server); - if (rc) { - cifs_dbg(FYI, - "SMB3 session key generation failed\n"); - cifs_server_unlock(server); - return rc; - } + if (server->vals->protocol_id == SMB311_PROT_ID) + rc = generate_smb311signingkey(ses, server); + else if (server->vals->protocol_id == SMB30_PROT_ID) + rc = generate_smb30signingkey(ses, server); + + if (rc) { + cifs_dbg(FYI, "SMB3 session key generation failed\n"); + cifs_server_unlock(server); + + return rc; } + if (!server->session_estab) { server->sequence_number = 0x2; server->session_estab = true; diff --git a/fs/smb/client/smb2proto.h b/fs/smb/client/smb2proto.h index 3cefa3c5b1e5..b024c0afee72 100644 --- a/fs/smb/client/smb2proto.h +++ b/fs/smb/client/smb2proto.h @@ -73,12 +73,6 @@ extern struct cifs_ses *smb2_find_smb_ses(struct TCP_Server_Info *server, __u64 ses_id); extern struct cifs_tcon *smb2_find_smb_tcon(struct TCP_Server_Info *server, __u64 ses_id, __u32 tid); -extern int smb2_calc_signature(struct smb_rqst *rqst, - struct TCP_Server_Info *server, - bool allocate_crypto); -extern int smb3_calc_signature(struct smb_rqst *rqst, - struct TCP_Server_Info *server, - bool allocate_crypto); extern void smb2_echo_request(struct work_struct *work); extern __le32 smb2_get_lease_state(struct cifsInodeInfo *cinode); extern bool smb2_is_valid_oplock_break(char *buffer, diff --git a/fs/smb/client/smb2transport.c b/fs/smb/client/smb2transport.c index a42654498abe..803474b42f18 100644 --- a/fs/smb/client/smb2transport.c +++ b/fs/smb/client/smb2transport.c @@ -227,9 +227,7 @@ smb2_find_smb_tcon(struct TCP_Server_Info *server, __u64 ses_id, __u32 tid) return tcon; } -int -smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server, - bool allocate_crypto) +static int smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server, bool alloc) { int rc; unsigned char smb2_signature[SMB2_HMACSHA256_SIZE]; @@ -249,7 +247,7 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server, memset(smb2_signature, 0x0, SMB2_HMACSHA256_SIZE); memset(shdr->Signature, 0x0, SMB2_SIGNATURE_SIZE); - if (allocate_crypto) { + if (alloc) { rc = cifs_alloc_hash("hmac(sha256)", &shash); if (rc) { cifs_server_dbg(VFS, @@ -301,7 +299,7 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server, memcpy(shdr->Signature, sigptr, SMB2_SIGNATURE_SIZE); out: - if (allocate_crypto) + if (alloc) cifs_free_hash(&shash); if (ses) cifs_put_smb_ses(ses); @@ -557,9 +555,7 @@ generate_smb311signingkey(struct cifs_ses *ses, return generate_smb3signingkey(ses, server, &triplet); } -int -smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server, - bool allocate_crypto) +static int smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server, bool alloc) { int rc; unsigned char smb3_signature[SMB2_CMACAES_SIZE]; @@ -576,7 +572,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server, return rc; } - if (allocate_crypto) { + if (alloc) { rc = cifs_alloc_hash("cmac(aes)", &shash); if (rc) return rc; @@ -629,16 +625,23 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server, memcpy(shdr->Signature, sigptr, SMB2_SIGNATURE_SIZE); out: - if (allocate_crypto) + if (alloc) cifs_free_hash(&shash); return rc; } +static int calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server, bool alloc) +{ + if (server->vals->protocol_id >= SMB30_PROT_ID) + return smb3_calc_signature(rqst, server, alloc); + + return smb2_calc_signature(rqst, server, alloc); +} + /* must be called with server->srv_mutex held */ static int smb2_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server) { - int rc = 0; struct smb2_hdr *shdr; struct smb2_sess_setup_req *ssr; bool is_binding; @@ -664,9 +667,7 @@ smb2_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server) return 0; } - rc = server->ops->calc_signature(rqst, server, false); - - return rc; + return calc_signature(rqst, server, false); } int @@ -674,14 +675,11 @@ smb2_verify_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server) { unsigned int rc; char server_response_sig[SMB2_SIGNATURE_SIZE]; - struct smb2_hdr *shdr = - (struct smb2_hdr *)rqst->rq_iov[0].iov_base; + struct smb2_hdr *shdr = (struct smb2_hdr *)rqst->rq_iov[0].iov_base; - if ((shdr->Command == SMB2_NEGOTIATE) || - (shdr->Command == SMB2_SESSION_SETUP) || - (shdr->Command == SMB2_OPLOCK_BREAK) || - server->ignore_signature || - (!server->session_estab)) + if (shdr->Command == SMB2_NEGOTIATE || shdr->Command == SMB2_SESSION_SETUP || + shdr->Command == SMB2_OPLOCK_BREAK || server->ignore_signature || + !server->session_estab) return 0; /* @@ -691,28 +689,27 @@ smb2_verify_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server) /* Do not need to verify session setups with signature "BSRSPYL " */ if (memcmp(shdr->Signature, "BSRSPYL ", 8) == 0) - cifs_dbg(FYI, "dummy signature received for smb command 0x%x\n", - shdr->Command); + cifs_dbg(FYI, "dummy signature received for smb command 0x%x\n", shdr->Command); /* * Save off the origiginal signature so we can modify the smb and check * our calculated signature against what the server sent. */ memcpy(server_response_sig, shdr->Signature, SMB2_SIGNATURE_SIZE); - memset(shdr->Signature, 0, SMB2_SIGNATURE_SIZE); - rc = server->ops->calc_signature(rqst, server, true); - + rc = calc_signature(rqst, server, true); if (rc) return rc; if (memcmp(server_response_sig, shdr->Signature, SMB2_SIGNATURE_SIZE)) { cifs_dbg(VFS, "sign fail cmd 0x%x message id 0x%llx\n", - shdr->Command, shdr->MessageId); + shdr->Command, shdr->MessageId); + return -EACCES; - } else - return 0; + } + + return 0; } /* |
