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 */
init_smb2_1_server(struct ksmbd_conn * conn)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 */
init_smb3_0_server(struct ksmbd_conn * conn)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 */
init_smb3_02_server(struct ksmbd_conn * conn)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 */
init_smb3_11_server(struct ksmbd_conn * conn)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
init_smb2_max_read_size(unsigned int sz)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
init_smb2_max_write_size(unsigned int sz)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
init_smb2_max_trans_size(unsigned int sz)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
init_smb2_max_credits(unsigned int sz)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