xref: /linux/fs/smb/server/smb2ops.c (revision ca220141fa8ebae09765a242076b2b77338106b0)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
4  *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
5  */
6 
7 #include <linux/slab.h>
8 #include "glob.h"
9 
10 #include "auth.h"
11 #include "connection.h"
12 #include "smb_common.h"
13 #include "server.h"
14 #include "stats.h"
15 
16 static struct smb_version_values smb21_server_values = {
17 	.version_string = SMB21_VERSION_STRING,
18 	.protocol_id = SMB21_PROT_ID,
19 	.req_capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
20 	.max_read_size = SMB21_DEFAULT_IOSIZE,
21 	.max_write_size = SMB21_DEFAULT_IOSIZE,
22 	.max_trans_size = SMB21_DEFAULT_IOSIZE,
23 	.max_credits = SMB2_MAX_CREDITS,
24 	.large_lock_type = 0,
25 	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
26 	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
27 	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
28 	.header_size = sizeof(struct smb2_hdr),
29 	.max_header_size = MAX_SMB2_HDR_SIZE,
30 	.read_rsp_size = sizeof(struct smb2_read_rsp),
31 	.lock_cmd = SMB2_LOCK,
32 	.cap_unix = 0,
33 	.cap_nt_find = SMB2_NT_FIND,
34 	.cap_large_files = SMB2_LARGE_FILES,
35 	.create_lease_size = sizeof(struct create_lease),
36 	.create_durable_size = sizeof(struct create_durable_rsp),
37 	.create_mxac_size = sizeof(struct create_mxac_rsp),
38 	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
39 	.create_posix_size = sizeof(struct create_posix_rsp),
40 };
41 
42 static struct smb_version_values smb30_server_values = {
43 	.version_string = SMB30_VERSION_STRING,
44 	.protocol_id = SMB30_PROT_ID,
45 	.req_capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
46 	.max_read_size = SMB3_DEFAULT_IOSIZE,
47 	.max_write_size = SMB3_DEFAULT_IOSIZE,
48 	.max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
49 	.max_credits = SMB2_MAX_CREDITS,
50 	.large_lock_type = 0,
51 	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
52 	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
53 	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
54 	.header_size = sizeof(struct smb2_hdr),
55 	.max_header_size = MAX_SMB2_HDR_SIZE,
56 	.read_rsp_size = sizeof(struct smb2_read_rsp),
57 	.lock_cmd = SMB2_LOCK,
58 	.cap_unix = 0,
59 	.cap_nt_find = SMB2_NT_FIND,
60 	.cap_large_files = SMB2_LARGE_FILES,
61 	.create_lease_size = sizeof(struct create_lease_v2),
62 	.create_durable_size = sizeof(struct create_durable_rsp),
63 	.create_durable_v2_size = sizeof(struct create_durable_rsp_v2),
64 	.create_mxac_size = sizeof(struct create_mxac_rsp),
65 	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
66 	.create_posix_size = sizeof(struct create_posix_rsp),
67 };
68 
69 static struct smb_version_values smb302_server_values = {
70 	.version_string = SMB302_VERSION_STRING,
71 	.protocol_id = SMB302_PROT_ID,
72 	.req_capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
73 	.max_read_size = SMB3_DEFAULT_IOSIZE,
74 	.max_write_size = SMB3_DEFAULT_IOSIZE,
75 	.max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
76 	.max_credits = SMB2_MAX_CREDITS,
77 	.large_lock_type = 0,
78 	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
79 	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
80 	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
81 	.header_size = sizeof(struct smb2_hdr),
82 	.max_header_size = MAX_SMB2_HDR_SIZE,
83 	.read_rsp_size = sizeof(struct smb2_read_rsp),
84 	.lock_cmd = SMB2_LOCK,
85 	.cap_unix = 0,
86 	.cap_nt_find = SMB2_NT_FIND,
87 	.cap_large_files = SMB2_LARGE_FILES,
88 	.create_lease_size = sizeof(struct create_lease_v2),
89 	.create_durable_size = sizeof(struct create_durable_rsp),
90 	.create_durable_v2_size = sizeof(struct create_durable_rsp_v2),
91 	.create_mxac_size = sizeof(struct create_mxac_rsp),
92 	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
93 	.create_posix_size = sizeof(struct create_posix_rsp),
94 };
95 
96 static struct smb_version_values smb311_server_values = {
97 	.version_string = SMB311_VERSION_STRING,
98 	.protocol_id = SMB311_PROT_ID,
99 	.req_capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
100 	.max_read_size = SMB3_DEFAULT_IOSIZE,
101 	.max_write_size = SMB3_DEFAULT_IOSIZE,
102 	.max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
103 	.max_credits = SMB2_MAX_CREDITS,
104 	.large_lock_type = 0,
105 	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
106 	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
107 	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
108 	.header_size = sizeof(struct smb2_hdr),
109 	.max_header_size = MAX_SMB2_HDR_SIZE,
110 	.read_rsp_size = sizeof(struct smb2_read_rsp),
111 	.lock_cmd = SMB2_LOCK,
112 	.cap_unix = 0,
113 	.cap_nt_find = SMB2_NT_FIND,
114 	.cap_large_files = SMB2_LARGE_FILES,
115 	.create_lease_size = sizeof(struct create_lease_v2),
116 	.create_durable_size = sizeof(struct create_durable_rsp),
117 	.create_durable_v2_size = sizeof(struct create_durable_rsp_v2),
118 	.create_mxac_size = sizeof(struct create_mxac_rsp),
119 	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
120 	.create_posix_size = sizeof(struct create_posix_rsp),
121 };
122 
123 static struct smb_version_ops smb2_0_server_ops = {
124 	.get_cmd_val		=	get_smb2_cmd_val,
125 	.inc_reqs		=	ksmbd_counter_inc_reqs,
126 	.init_rsp_hdr		=	init_smb2_rsp_hdr,
127 	.set_rsp_status		=	set_smb2_rsp_status,
128 	.allocate_rsp_buf       =       smb2_allocate_rsp_buf,
129 	.set_rsp_credits	=	smb2_set_rsp_credits,
130 	.check_user_session	=	smb2_check_user_session,
131 	.get_ksmbd_tcon		=	smb2_get_ksmbd_tcon,
132 	.is_sign_req		=	smb2_is_sign_req,
133 	.check_sign_req		=	smb2_check_sign_req,
134 	.set_sign_rsp		=	smb2_set_sign_rsp
135 };
136 
137 static struct smb_version_ops smb3_0_server_ops = {
138 	.get_cmd_val		=	get_smb2_cmd_val,
139 	.inc_reqs		=	ksmbd_counter_inc_reqs,
140 	.init_rsp_hdr		=	init_smb2_rsp_hdr,
141 	.set_rsp_status		=	set_smb2_rsp_status,
142 	.allocate_rsp_buf       =       smb2_allocate_rsp_buf,
143 	.set_rsp_credits	=	smb2_set_rsp_credits,
144 	.check_user_session	=	smb2_check_user_session,
145 	.get_ksmbd_tcon		=	smb2_get_ksmbd_tcon,
146 	.is_sign_req		=	smb2_is_sign_req,
147 	.check_sign_req		=	smb3_check_sign_req,
148 	.set_sign_rsp		=	smb3_set_sign_rsp,
149 	.generate_signingkey	=	ksmbd_gen_smb30_signingkey,
150 	.generate_encryptionkey	=	ksmbd_gen_smb30_encryptionkey,
151 	.is_transform_hdr	=	smb3_is_transform_hdr,
152 	.decrypt_req		=	smb3_decrypt_req,
153 	.encrypt_resp		=	smb3_encrypt_resp
154 };
155 
156 static struct smb_version_ops smb3_11_server_ops = {
157 	.get_cmd_val		=	get_smb2_cmd_val,
158 	.inc_reqs		=	ksmbd_counter_inc_reqs,
159 	.init_rsp_hdr		=	init_smb2_rsp_hdr,
160 	.set_rsp_status		=	set_smb2_rsp_status,
161 	.allocate_rsp_buf       =       smb2_allocate_rsp_buf,
162 	.set_rsp_credits	=	smb2_set_rsp_credits,
163 	.check_user_session	=	smb2_check_user_session,
164 	.get_ksmbd_tcon		=	smb2_get_ksmbd_tcon,
165 	.is_sign_req		=	smb2_is_sign_req,
166 	.check_sign_req		=	smb3_check_sign_req,
167 	.set_sign_rsp		=	smb3_set_sign_rsp,
168 	.generate_signingkey	=	ksmbd_gen_smb311_signingkey,
169 	.generate_encryptionkey	=	ksmbd_gen_smb311_encryptionkey,
170 	.is_transform_hdr	=	smb3_is_transform_hdr,
171 	.decrypt_req		=	smb3_decrypt_req,
172 	.encrypt_resp		=	smb3_encrypt_resp
173 };
174 
175 static struct smb_version_cmds smb2_0_server_cmds[NUMBER_OF_SMB2_COMMANDS] = {
176 	[SMB2_NEGOTIATE_HE]	=	{ .proc = smb2_negotiate_request, },
177 	[SMB2_SESSION_SETUP_HE] =	{ .proc = smb2_sess_setup, },
178 	[SMB2_TREE_CONNECT_HE]  =	{ .proc = smb2_tree_connect,},
179 	[SMB2_TREE_DISCONNECT_HE]  =	{ .proc = smb2_tree_disconnect,},
180 	[SMB2_LOGOFF_HE]	=	{ .proc = smb2_session_logoff,},
181 	[SMB2_CREATE_HE]	=	{ .proc = smb2_open},
182 	[SMB2_QUERY_INFO_HE]	=	{ .proc = smb2_query_info},
183 	[SMB2_QUERY_DIRECTORY_HE] =	{ .proc = smb2_query_dir},
184 	[SMB2_CLOSE_HE]		=	{ .proc = smb2_close},
185 	[SMB2_ECHO_HE]		=	{ .proc = smb2_echo},
186 	[SMB2_SET_INFO_HE]      =       { .proc = smb2_set_info},
187 	[SMB2_READ_HE]		=	{ .proc = smb2_read},
188 	[SMB2_WRITE_HE]		=	{ .proc = smb2_write},
189 	[SMB2_FLUSH_HE]		=	{ .proc = smb2_flush},
190 	[SMB2_CANCEL_HE]	=	{ .proc = smb2_cancel},
191 	[SMB2_LOCK_HE]		=	{ .proc = smb2_lock},
192 	[SMB2_IOCTL_HE]		=	{ .proc = smb2_ioctl},
193 	[SMB2_OPLOCK_BREAK_HE]	=	{ .proc = smb2_oplock_break},
194 	[SMB2_CHANGE_NOTIFY_HE]	=	{ .proc = smb2_notify},
195 };
196 
197 /**
198  * init_smb2_1_server() - initialize a smb server connection with smb2.1
199  *			command dispatcher
200  * @conn:	connection instance
201  */
202 void init_smb2_1_server(struct ksmbd_conn *conn)
203 {
204 	conn->vals = &smb21_server_values;
205 	conn->ops = &smb2_0_server_ops;
206 	conn->cmds = smb2_0_server_cmds;
207 	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
208 	conn->signing_algorithm = SIGNING_ALG_HMAC_SHA256_LE;
209 
210 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
211 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_LEASING;
212 }
213 
214 /**
215  * init_smb3_0_server() - initialize a smb server connection with smb3.0
216  *			command dispatcher
217  * @conn:	connection instance
218  */
219 void init_smb3_0_server(struct ksmbd_conn *conn)
220 {
221 	conn->vals = &smb30_server_values;
222 	conn->ops = &smb3_0_server_ops;
223 	conn->cmds = smb2_0_server_cmds;
224 	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
225 	conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
226 
227 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
228 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_LEASING |
229 			SMB2_GLOBAL_CAP_DIRECTORY_LEASING;
230 
231 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION &&
232 	    conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION)
233 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
234 
235 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION ||
236 	    (!(server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF) &&
237 	     conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION))
238 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
239 
240 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
241 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
242 }
243 
244 /**
245  * init_smb3_02_server() - initialize a smb server connection with smb3.02
246  *			command dispatcher
247  * @conn:	connection instance
248  */
249 void init_smb3_02_server(struct ksmbd_conn *conn)
250 {
251 	conn->vals = &smb302_server_values;
252 	conn->ops = &smb3_0_server_ops;
253 	conn->cmds = smb2_0_server_cmds;
254 	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
255 	conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
256 
257 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
258 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_LEASING |
259 			SMB2_GLOBAL_CAP_DIRECTORY_LEASING;
260 
261 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION ||
262 	    (!(server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF) &&
263 	     conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION))
264 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
265 
266 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
267 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
268 
269 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_DURABLE_HANDLE)
270 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_PERSISTENT_HANDLES;
271 }
272 
273 /**
274  * init_smb3_11_server() - initialize a smb server connection with smb3.11
275  *			command dispatcher
276  * @conn:	connection instance
277  */
278 int init_smb3_11_server(struct ksmbd_conn *conn)
279 {
280 	conn->vals = &smb311_server_values;
281 	conn->ops = &smb3_11_server_ops;
282 	conn->cmds = smb2_0_server_cmds;
283 	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
284 	conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
285 
286 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
287 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_LEASING |
288 			SMB2_GLOBAL_CAP_DIRECTORY_LEASING;
289 
290 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
291 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
292 
293 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_DURABLE_HANDLE)
294 		conn->vals->req_capabilities |= SMB2_GLOBAL_CAP_PERSISTENT_HANDLES;
295 
296 	INIT_LIST_HEAD(&conn->preauth_sess_table);
297 	return 0;
298 }
299 
300 void init_smb2_max_read_size(unsigned int sz)
301 {
302 	sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
303 	smb21_server_values.max_read_size = sz;
304 	smb30_server_values.max_read_size = sz;
305 	smb302_server_values.max_read_size = sz;
306 	smb311_server_values.max_read_size = sz;
307 }
308 
309 void init_smb2_max_write_size(unsigned int sz)
310 {
311 	sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
312 	smb21_server_values.max_write_size = sz;
313 	smb30_server_values.max_write_size = sz;
314 	smb302_server_values.max_write_size = sz;
315 	smb311_server_values.max_write_size = sz;
316 }
317 
318 void init_smb2_max_trans_size(unsigned int sz)
319 {
320 	sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
321 	smb21_server_values.max_trans_size = sz;
322 	smb30_server_values.max_trans_size = sz;
323 	smb302_server_values.max_trans_size = sz;
324 	smb311_server_values.max_trans_size = sz;
325 }
326 
327 void init_smb2_max_credits(unsigned int sz)
328 {
329 	smb21_server_values.max_credits = sz;
330 	smb30_server_values.max_credits = sz;
331 	smb302_server_values.max_credits = sz;
332 	smb311_server_values.max_credits = sz;
333 }
334