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