summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnzo Matsumiya <ematsumiya@suse.de>2024-11-14 14:44:41 -0300
committerEnzo Matsumiya <ematsumiya@suse.de>2024-11-14 15:54:45 -0300
commit60eed99db98cb0138209a943d5b8c79af7f7481f (patch)
tree3991fbd7f3e48c200c70586b5248660385775722
parent624c2965b0681d3c41a18067001972a6e69f1171 (diff)
downloadlinux-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.h4
-rw-r--r--fs/smb/client/smb2ops.c5
-rw-r--r--fs/smb/client/smb2pdu.c19
-rw-r--r--fs/smb/client/smb2proto.h6
-rw-r--r--fs/smb/client/smb2transport.c55
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;
}
/*