Linux Audio

Check our new training course

Loading...
v6.2
   1// SPDX-License-Identifier: LGPL-2.1
   2/*
 
   3 *
   4 *   SMB/CIFS session setup handling routines
   5 *
   6 *   Copyright (c) International Business Machines  Corp., 2006, 2009
   7 *   Author(s): Steve French (sfrench@us.ibm.com)
   8 *
   9 */
  10
  11#include "cifspdu.h"
  12#include "cifsglob.h"
  13#include "cifsproto.h"
  14#include "cifs_unicode.h"
  15#include "cifs_debug.h"
  16#include "ntlmssp.h"
  17#include "nterr.h"
  18#include <linux/utsname.h>
  19#include <linux/slab.h>
  20#include <linux/version.h>
  21#include "cifsfs.h"
  22#include "cifs_spnego.h"
  23#include "smb2proto.h"
  24#include "fs_context.h"
  25
  26static int
  27cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
  28		     struct cifs_server_iface *iface);
  29
  30bool
  31is_server_using_iface(struct TCP_Server_Info *server,
  32		      struct cifs_server_iface *iface)
  33{
  34	struct sockaddr_in *i4 = (struct sockaddr_in *)&iface->sockaddr;
  35	struct sockaddr_in6 *i6 = (struct sockaddr_in6 *)&iface->sockaddr;
  36	struct sockaddr_in *s4 = (struct sockaddr_in *)&server->dstaddr;
  37	struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)&server->dstaddr;
  38
  39	if (server->dstaddr.ss_family != iface->sockaddr.ss_family)
  40		return false;
  41	if (server->dstaddr.ss_family == AF_INET) {
  42		if (s4->sin_addr.s_addr != i4->sin_addr.s_addr)
  43			return false;
  44	} else if (server->dstaddr.ss_family == AF_INET6) {
  45		if (memcmp(&s6->sin6_addr, &i6->sin6_addr,
  46			   sizeof(i6->sin6_addr)) != 0)
  47			return false;
  48	} else {
  49		/* unknown family.. */
  50		return false;
  51	}
  52	return true;
  53}
  54
  55bool is_ses_using_iface(struct cifs_ses *ses, struct cifs_server_iface *iface)
  56{
  57	int i;
  58
  59	spin_lock(&ses->chan_lock);
  60	for (i = 0; i < ses->chan_count; i++) {
  61		if (ses->chans[i].iface == iface) {
  62			spin_unlock(&ses->chan_lock);
  63			return true;
  64		}
  65	}
  66	spin_unlock(&ses->chan_lock);
  67	return false;
  68}
  69
  70/* channel helper functions. assumed that chan_lock is held by caller. */
  71
  72unsigned int
  73cifs_ses_get_chan_index(struct cifs_ses *ses,
  74			struct TCP_Server_Info *server)
  75{
  76	unsigned int i;
  77
  78	for (i = 0; i < ses->chan_count; i++) {
  79		if (ses->chans[i].server == server)
  80			return i;
  81	}
  82
  83	/* If we didn't find the channel, it is likely a bug */
  84	if (server)
  85		cifs_dbg(VFS, "unable to get chan index for server: 0x%llx",
  86			 server->conn_id);
  87	WARN_ON(1);
  88	return 0;
  89}
  90
  91void
  92cifs_chan_set_in_reconnect(struct cifs_ses *ses,
  93			     struct TCP_Server_Info *server)
  94{
  95	unsigned int chan_index = cifs_ses_get_chan_index(ses, server);
  96
  97	ses->chans[chan_index].in_reconnect = true;
  98}
  99
 100void
 101cifs_chan_clear_in_reconnect(struct cifs_ses *ses,
 102			     struct TCP_Server_Info *server)
 103{
 104	unsigned int chan_index = cifs_ses_get_chan_index(ses, server);
 105
 106	ses->chans[chan_index].in_reconnect = false;
 107}
 108
 109bool
 110cifs_chan_in_reconnect(struct cifs_ses *ses,
 111			  struct TCP_Server_Info *server)
 112{
 113	unsigned int chan_index = cifs_ses_get_chan_index(ses, server);
 114
 115	return CIFS_CHAN_IN_RECONNECT(ses, chan_index);
 116}
 117
 118void
 119cifs_chan_set_need_reconnect(struct cifs_ses *ses,
 120			     struct TCP_Server_Info *server)
 121{
 122	unsigned int chan_index = cifs_ses_get_chan_index(ses, server);
 123
 124	set_bit(chan_index, &ses->chans_need_reconnect);
 125	cifs_dbg(FYI, "Set reconnect bitmask for chan %u; now 0x%lx\n",
 126		 chan_index, ses->chans_need_reconnect);
 127}
 128
 129void
 130cifs_chan_clear_need_reconnect(struct cifs_ses *ses,
 131			       struct TCP_Server_Info *server)
 132{
 133	unsigned int chan_index = cifs_ses_get_chan_index(ses, server);
 134
 135	clear_bit(chan_index, &ses->chans_need_reconnect);
 136	cifs_dbg(FYI, "Cleared reconnect bitmask for chan %u; now 0x%lx\n",
 137		 chan_index, ses->chans_need_reconnect);
 138}
 139
 140bool
 141cifs_chan_needs_reconnect(struct cifs_ses *ses,
 142			  struct TCP_Server_Info *server)
 143{
 144	unsigned int chan_index = cifs_ses_get_chan_index(ses, server);
 145
 146	return CIFS_CHAN_NEEDS_RECONNECT(ses, chan_index);
 147}
 148
 149bool
 150cifs_chan_is_iface_active(struct cifs_ses *ses,
 151			  struct TCP_Server_Info *server)
 152{
 153	unsigned int chan_index = cifs_ses_get_chan_index(ses, server);
 154
 155	return ses->chans[chan_index].iface &&
 156		ses->chans[chan_index].iface->is_active;
 157}
 158
 159/* returns number of channels added */
 160int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses)
 161{
 162	int old_chan_count, new_chan_count;
 163	int left;
 
 164	int rc = 0;
 165	int tries = 0;
 166	struct cifs_server_iface *iface = NULL, *niface = NULL;
 167
 168	spin_lock(&ses->chan_lock);
 169
 170	new_chan_count = old_chan_count = ses->chan_count;
 171	left = ses->chan_max - ses->chan_count;
 172
 173	if (left <= 0) {
 174		spin_unlock(&ses->chan_lock);
 175		cifs_dbg(FYI,
 176			 "ses already at max_channels (%zu), nothing to open\n",
 177			 ses->chan_max);
 178		return 0;
 179	}
 180
 181	if (ses->server->dialect < SMB30_PROT_ID) {
 182		spin_unlock(&ses->chan_lock);
 183		cifs_dbg(VFS, "multichannel is not supported on this protocol version, use 3.0 or above\n");
 184		return 0;
 185	}
 186
 187	if (!(ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) {
 188		ses->chan_max = 1;
 189		spin_unlock(&ses->chan_lock);
 190		cifs_dbg(VFS, "server %s does not support multichannel\n", ses->server->hostname);
 
 191		return 0;
 192	}
 193	spin_unlock(&ses->chan_lock);
 194
 195	/*
 196	 * Keep connecting to same, fastest, iface for all channels as
 197	 * long as its RSS. Try next fastest one if not RSS or channel
 198	 * creation fails.
 199	 */
 200	spin_lock(&ses->iface_lock);
 201	iface = list_first_entry(&ses->iface_list, struct cifs_server_iface,
 202				 iface_head);
 
 
 
 
 
 
 
 
 
 
 203	spin_unlock(&ses->iface_lock);
 204
 
 
 
 
 
 205	while (left > 0) {
 
 206
 207		tries++;
 208		if (tries > 3*ses->chan_max) {
 209			cifs_dbg(FYI, "too many channel open attempts (%d channels left to open)\n",
 210				 left);
 211			break;
 212		}
 213
 214		spin_lock(&ses->iface_lock);
 215		if (!ses->iface_count) {
 216			spin_unlock(&ses->iface_lock);
 217			break;
 218		}
 219
 220		list_for_each_entry_safe_from(iface, niface, &ses->iface_list,
 221				    iface_head) {
 222			/* skip ifaces that are unusable */
 223			if (!iface->is_active ||
 224			    (is_ses_using_iface(ses, iface) &&
 225			     !iface->rss_capable)) {
 226				continue;
 227			}
 228
 229			/* take ref before unlock */
 230			kref_get(&iface->refcount);
 231
 232			spin_unlock(&ses->iface_lock);
 233			rc = cifs_ses_add_channel(cifs_sb, ses, iface);
 234			spin_lock(&ses->iface_lock);
 235
 236			if (rc) {
 237				cifs_dbg(VFS, "failed to open extra channel on iface:%pIS rc=%d\n",
 238					 &iface->sockaddr,
 239					 rc);
 240				kref_put(&iface->refcount, release_iface);
 241				continue;
 242			}
 243
 244			cifs_dbg(FYI, "successfully opened new channel on iface:%pIS\n",
 245				 &iface->sockaddr);
 246			break;
 247		}
 248		spin_unlock(&ses->iface_lock);
 249
 250		left--;
 251		new_chan_count++;
 252	}
 253
 254	return new_chan_count - old_chan_count;
 255}
 256
 257/*
 258 * update the iface for the channel if necessary.
 259 * will return 0 when iface is updated, 1 if removed, 2 otherwise
 260 * Must be called with chan_lock held.
 261 */
 262int
 263cifs_chan_update_iface(struct cifs_ses *ses, struct TCP_Server_Info *server)
 264{
 265	unsigned int chan_index;
 266	struct cifs_server_iface *iface = NULL;
 267	struct cifs_server_iface *old_iface = NULL;
 268	int rc = 0;
 269
 270	spin_lock(&ses->chan_lock);
 271	chan_index = cifs_ses_get_chan_index(ses, server);
 272	if (!chan_index) {
 273		spin_unlock(&ses->chan_lock);
 274		return 0;
 275	}
 276
 277	if (ses->chans[chan_index].iface) {
 278		old_iface = ses->chans[chan_index].iface;
 279		if (old_iface->is_active) {
 280			spin_unlock(&ses->chan_lock);
 281			return 1;
 282		}
 283	}
 284	spin_unlock(&ses->chan_lock);
 285
 286	spin_lock(&ses->iface_lock);
 287	/* then look for a new one */
 288	list_for_each_entry(iface, &ses->iface_list, iface_head) {
 289		if (!iface->is_active ||
 290		    (is_ses_using_iface(ses, iface) &&
 291		     !iface->rss_capable)) {
 292			continue;
 293		}
 294		kref_get(&iface->refcount);
 295		break;
 296	}
 297
 298	if (list_entry_is_head(iface, &ses->iface_list, iface_head)) {
 299		rc = 1;
 300		iface = NULL;
 301		cifs_dbg(FYI, "unable to find a suitable iface\n");
 302	}
 303
 304	/* now drop the ref to the current iface */
 305	if (old_iface && iface) {
 306		cifs_dbg(FYI, "replacing iface: %pIS with %pIS\n",
 307			 &old_iface->sockaddr,
 308			 &iface->sockaddr);
 309		kref_put(&old_iface->refcount, release_iface);
 310	} else if (old_iface) {
 311		cifs_dbg(FYI, "releasing ref to iface: %pIS\n",
 312			 &old_iface->sockaddr);
 313		kref_put(&old_iface->refcount, release_iface);
 314	} else {
 315		WARN_ON(!iface);
 316		cifs_dbg(FYI, "adding new iface: %pIS\n", &iface->sockaddr);
 317	}
 318	spin_unlock(&ses->iface_lock);
 319
 320	spin_lock(&ses->chan_lock);
 321	chan_index = cifs_ses_get_chan_index(ses, server);
 322	ses->chans[chan_index].iface = iface;
 323
 324	/* No iface is found. if secondary chan, drop connection */
 325	if (!iface && CIFS_SERVER_IS_CHAN(server))
 326		ses->chans[chan_index].server = NULL;
 327
 328	spin_unlock(&ses->chan_lock);
 329
 330	if (!iface && CIFS_SERVER_IS_CHAN(server))
 331		cifs_put_tcp_session(server, false);
 332
 333	return rc;
 334}
 335
 336/*
 337 * If server is a channel of ses, return the corresponding enclosing
 338 * cifs_chan otherwise return NULL.
 339 */
 340struct cifs_chan *
 341cifs_ses_find_chan(struct cifs_ses *ses, struct TCP_Server_Info *server)
 342{
 343	int i;
 344
 345	spin_lock(&ses->chan_lock);
 346	for (i = 0; i < ses->chan_count; i++) {
 347		if (ses->chans[i].server == server) {
 348			spin_unlock(&ses->chan_lock);
 349			return &ses->chans[i];
 350		}
 351	}
 352	spin_unlock(&ses->chan_lock);
 353	return NULL;
 354}
 355
 356static int
 357cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
 358		     struct cifs_server_iface *iface)
 359{
 360	struct TCP_Server_Info *chan_server;
 361	struct cifs_chan *chan;
 362	struct smb3_fs_context ctx = {NULL};
 363	static const char unc_fmt[] = "\\%s\\foo";
 364	char unc[sizeof(unc_fmt)+SERVER_NAME_LEN_WITH_NULL] = {0};
 365	struct sockaddr_in *ipv4 = (struct sockaddr_in *)&iface->sockaddr;
 366	struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&iface->sockaddr;
 367	int rc;
 368	unsigned int xid = get_xid();
 369
 370	if (iface->sockaddr.ss_family == AF_INET)
 371		cifs_dbg(FYI, "adding channel to ses %p (speed:%zu bps rdma:%s ip:%pI4)\n",
 372			 ses, iface->speed, iface->rdma_capable ? "yes" : "no",
 373			 &ipv4->sin_addr);
 374	else
 375		cifs_dbg(FYI, "adding channel to ses %p (speed:%zu bps rdma:%s ip:%pI6)\n",
 376			 ses, iface->speed, iface->rdma_capable ? "yes" : "no",
 377			 &ipv6->sin6_addr);
 378
 379	/*
 380	 * Setup a ctx with mostly the same info as the existing
 381	 * session and overwrite it with the requested iface data.
 382	 *
 383	 * We need to setup at least the fields used for negprot and
 384	 * sesssetup.
 385	 *
 386	 * We only need the ctx here, so we can reuse memory from
 387	 * the session and server without caring about memory
 388	 * management.
 389	 */
 390
 391	/* Always make new connection for now (TODO?) */
 392	ctx.nosharesock = true;
 393
 394	/* Auth */
 395	ctx.domainauto = ses->domainAuto;
 396	ctx.domainname = ses->domainName;
 397
 398	/* no hostname for extra channels */
 399	ctx.server_hostname = "";
 400
 401	ctx.username = ses->user_name;
 402	ctx.password = ses->password;
 403	ctx.sectype = ses->sectype;
 404	ctx.sign = ses->sign;
 405
 406	/* UNC and paths */
 407	/* XXX: Use ses->server->hostname? */
 408	sprintf(unc, unc_fmt, ses->ip_addr);
 409	ctx.UNC = unc;
 410	ctx.prepath = "";
 411
 412	/* Reuse same version as master connection */
 413	ctx.vals = ses->server->vals;
 414	ctx.ops = ses->server->ops;
 415
 416	ctx.noblocksnd = ses->server->noblocksnd;
 417	ctx.noautotune = ses->server->noautotune;
 418	ctx.sockopt_tcp_nodelay = ses->server->tcp_nodelay;
 419	ctx.echo_interval = ses->server->echo_interval / HZ;
 420	ctx.max_credits = ses->server->max_credits;
 421
 422	/*
 423	 * This will be used for encoding/decoding user/domain/pw
 424	 * during sess setup auth.
 425	 */
 426	ctx.local_nls = cifs_sb->local_nls;
 427
 428	/* Use RDMA if possible */
 429	ctx.rdma = iface->rdma_capable;
 430	memcpy(&ctx.dstaddr, &iface->sockaddr, sizeof(struct sockaddr_storage));
 431
 432	/* reuse master con client guid */
 433	memcpy(&ctx.client_guid, ses->server->client_guid,
 434	       SMB2_CLIENT_GUID_SIZE);
 435	ctx.use_client_guid = true;
 436
 437	chan_server = cifs_get_tcp_session(&ctx, ses->server);
 438
 439	spin_lock(&ses->chan_lock);
 440	chan = &ses->chans[ses->chan_count];
 441	chan->server = chan_server;
 442	if (IS_ERR(chan->server)) {
 443		rc = PTR_ERR(chan->server);
 444		chan->server = NULL;
 445		spin_unlock(&ses->chan_lock);
 446		goto out;
 447	}
 448	chan->iface = iface;
 449	ses->chan_count++;
 450	atomic_set(&ses->chan_seq, 0);
 451
 452	/* Mark this channel as needing connect/setup */
 453	cifs_chan_set_need_reconnect(ses, chan->server);
 454
 455	spin_unlock(&ses->chan_lock);
 456
 457	mutex_lock(&ses->session_mutex);
 458	/*
 459	 * We need to allocate the server crypto now as we will need
 460	 * to sign packets before we generate the channel signing key
 461	 * (we sign with the session key)
 462	 */
 463	rc = smb311_crypto_shash_allocate(chan->server);
 464	if (rc) {
 465		cifs_dbg(VFS, "%s: crypto alloc failed\n", __func__);
 466		mutex_unlock(&ses->session_mutex);
 467		goto out;
 468	}
 469
 470	rc = cifs_negotiate_protocol(xid, ses, chan->server);
 471	if (!rc)
 472		rc = cifs_setup_session(xid, ses, chan->server, cifs_sb->local_nls);
 
 473
 474	mutex_unlock(&ses->session_mutex);
 
 
 
 
 
 
 
 
 
 
 
 
 475
 
 
 476out:
 477	if (rc && chan->server) {
 478		/*
 479		 * we should avoid race with these delayed works before we
 480		 * remove this channel
 481		 */
 482		cancel_delayed_work_sync(&chan->server->echo);
 483		cancel_delayed_work_sync(&chan->server->resolve);
 484		cancel_delayed_work_sync(&chan->server->reconnect);
 485
 486		spin_lock(&ses->chan_lock);
 487		/* we rely on all bits beyond chan_count to be clear */
 488		cifs_chan_clear_need_reconnect(ses, chan->server);
 489		ses->chan_count--;
 490		/*
 491		 * chan_count should never reach 0 as at least the primary
 492		 * channel is always allocated
 493		 */
 494		WARN_ON(ses->chan_count < 1);
 495		spin_unlock(&ses->chan_lock);
 496
 
 497		cifs_put_tcp_session(chan->server, 0);
 498	}
 499
 500	free_xid(xid);
 501	return rc;
 502}
 503
 504#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
 505static __u32 cifs_ssetup_hdr(struct cifs_ses *ses,
 506			     struct TCP_Server_Info *server,
 507			     SESSION_SETUP_ANDX *pSMB)
 508{
 509	__u32 capabilities = 0;
 510
 511	/* init fields common to all four types of SessSetup */
 512	/* Note that offsets for first seven fields in req struct are same  */
 513	/*	in CIFS Specs so does not matter which of 3 forms of struct */
 514	/*	that we use in next few lines                               */
 515	/* Note that header is initialized to zero in header_assemble */
 516	pSMB->req.AndXCommand = 0xFF;
 517	pSMB->req.MaxBufferSize = cpu_to_le16(min_t(u32,
 518					CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4,
 519					USHRT_MAX));
 520	pSMB->req.MaxMpxCount = cpu_to_le16(server->maxReq);
 521	pSMB->req.VcNumber = cpu_to_le16(1);
 522
 523	/* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */
 524
 525	/* BB verify whether signing required on neg or just on auth frame
 526	   (and NTLM case) */
 527
 528	capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS |
 529			CAP_LARGE_WRITE_X | CAP_LARGE_READ_X;
 530
 531	if (server->sign)
 532		pSMB->req.hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
 533
 534	if (ses->capabilities & CAP_UNICODE) {
 535		pSMB->req.hdr.Flags2 |= SMBFLG2_UNICODE;
 536		capabilities |= CAP_UNICODE;
 537	}
 538	if (ses->capabilities & CAP_STATUS32) {
 539		pSMB->req.hdr.Flags2 |= SMBFLG2_ERR_STATUS;
 540		capabilities |= CAP_STATUS32;
 541	}
 542	if (ses->capabilities & CAP_DFS) {
 543		pSMB->req.hdr.Flags2 |= SMBFLG2_DFS;
 544		capabilities |= CAP_DFS;
 545	}
 546	if (ses->capabilities & CAP_UNIX)
 547		capabilities |= CAP_UNIX;
 548
 549	return capabilities;
 550}
 551
 552static void
 553unicode_oslm_strings(char **pbcc_area, const struct nls_table *nls_cp)
 554{
 555	char *bcc_ptr = *pbcc_area;
 556	int bytes_ret = 0;
 557
 558	/* Copy OS version */
 559	bytes_ret = cifs_strtoUTF16((__le16 *)bcc_ptr, "Linux version ", 32,
 560				    nls_cp);
 561	bcc_ptr += 2 * bytes_ret;
 562	bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, init_utsname()->release,
 563				    32, nls_cp);
 564	bcc_ptr += 2 * bytes_ret;
 565	bcc_ptr += 2; /* trailing null */
 566
 567	bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS,
 568				    32, nls_cp);
 569	bcc_ptr += 2 * bytes_ret;
 570	bcc_ptr += 2; /* trailing null */
 571
 572	*pbcc_area = bcc_ptr;
 573}
 574
 575static void unicode_domain_string(char **pbcc_area, struct cifs_ses *ses,
 576				   const struct nls_table *nls_cp)
 577{
 578	char *bcc_ptr = *pbcc_area;
 579	int bytes_ret = 0;
 580
 581	/* copy domain */
 582	if (ses->domainName == NULL) {
 583		/* Sending null domain better than using a bogus domain name (as
 584		we did briefly in 2.6.18) since server will use its default */
 585		*bcc_ptr = 0;
 586		*(bcc_ptr+1) = 0;
 587		bytes_ret = 0;
 588	} else
 589		bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->domainName,
 590					    CIFS_MAX_DOMAINNAME_LEN, nls_cp);
 591	bcc_ptr += 2 * bytes_ret;
 592	bcc_ptr += 2;  /* account for null terminator */
 593
 594	*pbcc_area = bcc_ptr;
 595}
 596
 
 597static void unicode_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
 598				   const struct nls_table *nls_cp)
 599{
 600	char *bcc_ptr = *pbcc_area;
 601	int bytes_ret = 0;
 602
 603	/* BB FIXME add check that strings total less
 604	than 335 or will need to send them as arrays */
 605
 
 
 
 
 
 606	/* copy user */
 607	if (ses->user_name == NULL) {
 608		/* null user mount */
 609		*bcc_ptr = 0;
 610		*(bcc_ptr+1) = 0;
 611	} else {
 612		bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->user_name,
 613					    CIFS_MAX_USERNAME_LEN, nls_cp);
 614	}
 615	bcc_ptr += 2 * bytes_ret;
 616	bcc_ptr += 2; /* account for null termination */
 617
 618	unicode_domain_string(&bcc_ptr, ses, nls_cp);
 619	unicode_oslm_strings(&bcc_ptr, nls_cp);
 620
 621	*pbcc_area = bcc_ptr;
 622}
 623
 624static void ascii_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
 625				 const struct nls_table *nls_cp)
 626{
 627	char *bcc_ptr = *pbcc_area;
 628	int len;
 629
 630	/* copy user */
 631	/* BB what about null user mounts - check that we do this BB */
 632	/* copy user */
 633	if (ses->user_name != NULL) {
 634		len = strscpy(bcc_ptr, ses->user_name, CIFS_MAX_USERNAME_LEN);
 635		if (WARN_ON_ONCE(len < 0))
 636			len = CIFS_MAX_USERNAME_LEN - 1;
 637		bcc_ptr += len;
 638	}
 639	/* else null user mount */
 640	*bcc_ptr = 0;
 641	bcc_ptr++; /* account for null termination */
 642
 643	/* copy domain */
 644	if (ses->domainName != NULL) {
 645		len = strscpy(bcc_ptr, ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
 646		if (WARN_ON_ONCE(len < 0))
 647			len = CIFS_MAX_DOMAINNAME_LEN - 1;
 648		bcc_ptr += len;
 649	} /* else we will send a null domain name
 650	     so the server will default to its own domain */
 651	*bcc_ptr = 0;
 652	bcc_ptr++;
 653
 654	/* BB check for overflow here */
 655
 656	strcpy(bcc_ptr, "Linux version ");
 657	bcc_ptr += strlen("Linux version ");
 658	strcpy(bcc_ptr, init_utsname()->release);
 659	bcc_ptr += strlen(init_utsname()->release) + 1;
 660
 661	strcpy(bcc_ptr, CIFS_NETWORK_OPSYS);
 662	bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1;
 663
 664	*pbcc_area = bcc_ptr;
 665}
 666
 667static void
 668decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifs_ses *ses,
 669		      const struct nls_table *nls_cp)
 670{
 671	int len;
 672	char *data = *pbcc_area;
 673
 674	cifs_dbg(FYI, "bleft %d\n", bleft);
 675
 676	kfree(ses->serverOS);
 677	ses->serverOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
 678	cifs_dbg(FYI, "serverOS=%s\n", ses->serverOS);
 679	len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
 680	data += len;
 681	bleft -= len;
 682	if (bleft <= 0)
 683		return;
 684
 685	kfree(ses->serverNOS);
 686	ses->serverNOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
 687	cifs_dbg(FYI, "serverNOS=%s\n", ses->serverNOS);
 688	len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
 689	data += len;
 690	bleft -= len;
 691	if (bleft <= 0)
 692		return;
 693
 694	kfree(ses->serverDomain);
 695	ses->serverDomain = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
 696	cifs_dbg(FYI, "serverDomain=%s\n", ses->serverDomain);
 697
 698	return;
 699}
 700
 701static void decode_ascii_ssetup(char **pbcc_area, __u16 bleft,
 702				struct cifs_ses *ses,
 703				const struct nls_table *nls_cp)
 704{
 705	int len;
 706	char *bcc_ptr = *pbcc_area;
 707
 708	cifs_dbg(FYI, "decode sessetup ascii. bleft %d\n", bleft);
 709
 710	len = strnlen(bcc_ptr, bleft);
 711	if (len >= bleft)
 712		return;
 713
 714	kfree(ses->serverOS);
 715
 716	ses->serverOS = kmalloc(len + 1, GFP_KERNEL);
 717	if (ses->serverOS) {
 718		memcpy(ses->serverOS, bcc_ptr, len);
 719		ses->serverOS[len] = 0;
 720		if (strncmp(ses->serverOS, "OS/2", 4) == 0)
 721			cifs_dbg(FYI, "OS/2 server\n");
 722	}
 723
 724	bcc_ptr += len + 1;
 725	bleft -= len + 1;
 726
 727	len = strnlen(bcc_ptr, bleft);
 728	if (len >= bleft)
 729		return;
 730
 731	kfree(ses->serverNOS);
 732
 733	ses->serverNOS = kmalloc(len + 1, GFP_KERNEL);
 734	if (ses->serverNOS) {
 735		memcpy(ses->serverNOS, bcc_ptr, len);
 736		ses->serverNOS[len] = 0;
 737	}
 738
 739	bcc_ptr += len + 1;
 740	bleft -= len + 1;
 741
 742	len = strnlen(bcc_ptr, bleft);
 743	if (len > bleft)
 744		return;
 745
 746	/* No domain field in LANMAN case. Domain is
 747	   returned by old servers in the SMB negprot response */
 748	/* BB For newer servers which do not support Unicode,
 749	   but thus do return domain here we could add parsing
 750	   for it later, but it is not very important */
 751	cifs_dbg(FYI, "ascii: bytes left %d\n", bleft);
 752}
 753#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
 754
 755int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len,
 756				    struct cifs_ses *ses)
 757{
 758	unsigned int tioffset; /* challenge message target info area */
 759	unsigned int tilen; /* challenge message target info area length  */
 
 760	CHALLENGE_MESSAGE *pblob = (CHALLENGE_MESSAGE *)bcc_ptr;
 761	__u32 server_flags;
 762
 763	if (blob_len < sizeof(CHALLENGE_MESSAGE)) {
 764		cifs_dbg(VFS, "challenge blob len %d too small\n", blob_len);
 765		return -EINVAL;
 766	}
 767
 768	if (memcmp(pblob->Signature, "NTLMSSP", 8)) {
 769		cifs_dbg(VFS, "blob signature incorrect %s\n",
 770			 pblob->Signature);
 771		return -EINVAL;
 772	}
 773	if (pblob->MessageType != NtLmChallenge) {
 774		cifs_dbg(VFS, "Incorrect message type %d\n",
 775			 pblob->MessageType);
 776		return -EINVAL;
 777	}
 778
 779	server_flags = le32_to_cpu(pblob->NegotiateFlags);
 780	cifs_dbg(FYI, "%s: negotiate=0x%08x challenge=0x%08x\n", __func__,
 781		 ses->ntlmssp->client_flags, server_flags);
 782
 783	if ((ses->ntlmssp->client_flags & (NTLMSSP_NEGOTIATE_SEAL | NTLMSSP_NEGOTIATE_SIGN)) &&
 784	    (!(server_flags & NTLMSSP_NEGOTIATE_56) && !(server_flags & NTLMSSP_NEGOTIATE_128))) {
 785		cifs_dbg(VFS, "%s: requested signing/encryption but server did not return either 56-bit or 128-bit session key size\n",
 786			 __func__);
 787		return -EINVAL;
 788	}
 789	if (!(server_flags & NTLMSSP_NEGOTIATE_NTLM) && !(server_flags & NTLMSSP_NEGOTIATE_EXTENDED_SEC)) {
 790		cifs_dbg(VFS, "%s: server does not seem to support either NTLMv1 or NTLMv2\n", __func__);
 791		return -EINVAL;
 792	}
 793	if (ses->server->sign && !(server_flags & NTLMSSP_NEGOTIATE_SIGN)) {
 794		cifs_dbg(VFS, "%s: forced packet signing but server does not seem to support it\n",
 795			 __func__);
 796		return -EOPNOTSUPP;
 797	}
 798	if ((ses->ntlmssp->client_flags & NTLMSSP_NEGOTIATE_KEY_XCH) &&
 799	    !(server_flags & NTLMSSP_NEGOTIATE_KEY_XCH))
 800		pr_warn_once("%s: authentication has been weakened as server does not support key exchange\n",
 801			     __func__);
 802
 803	ses->ntlmssp->server_flags = server_flags;
 804
 805	memcpy(ses->ntlmssp->cryptkey, pblob->Challenge, CIFS_CRYPTO_KEY_SIZE);
 
 806	/* In particular we can examine sign flags */
 807	/* BB spec says that if AvId field of MsvAvTimestamp is populated then
 808		we must set the MIC field of the AUTHENTICATE_MESSAGE */
 809
 810	tioffset = le32_to_cpu(pblob->TargetInfoArray.BufferOffset);
 811	tilen = le16_to_cpu(pblob->TargetInfoArray.Length);
 812	if (tioffset > blob_len || tioffset + tilen > blob_len) {
 813		cifs_dbg(VFS, "tioffset + tilen too high %u + %u\n",
 814			 tioffset, tilen);
 815		return -EINVAL;
 816	}
 817	if (tilen) {
 818		kfree_sensitive(ses->auth_key.response);
 819		ses->auth_key.response = kmemdup(bcc_ptr + tioffset, tilen,
 820						 GFP_KERNEL);
 821		if (!ses->auth_key.response) {
 822			cifs_dbg(VFS, "Challenge target info alloc failure\n");
 823			return -ENOMEM;
 824		}
 825		ses->auth_key.len = tilen;
 826	}
 827
 828	return 0;
 829}
 830
 831static int size_of_ntlmssp_blob(struct cifs_ses *ses, int base_size)
 832{
 833	int sz = base_size + ses->auth_key.len
 834		- CIFS_SESS_KEY_SIZE + CIFS_CPHTXT_SIZE + 2;
 835
 836	if (ses->domainName)
 837		sz += sizeof(__le16) * strnlen(ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
 838	else
 839		sz += sizeof(__le16);
 840
 841	if (ses->user_name)
 842		sz += sizeof(__le16) * strnlen(ses->user_name, CIFS_MAX_USERNAME_LEN);
 843	else
 844		sz += sizeof(__le16);
 845
 846	if (ses->workstation_name[0])
 847		sz += sizeof(__le16) * strnlen(ses->workstation_name,
 848					       ntlmssp_workstation_name_size(ses));
 849	else
 850		sz += sizeof(__le16);
 851
 852	return sz;
 853}
 854
 855static inline void cifs_security_buffer_from_str(SECURITY_BUFFER *pbuf,
 856						 char *str_value,
 857						 int str_length,
 858						 unsigned char *pstart,
 859						 unsigned char **pcur,
 860						 const struct nls_table *nls_cp)
 861{
 862	unsigned char *tmp = pstart;
 863	int len;
 864
 865	if (!pbuf)
 866		return;
 867
 868	if (!pcur)
 869		pcur = &tmp;
 870
 871	if (!str_value) {
 872		pbuf->BufferOffset = cpu_to_le32(*pcur - pstart);
 873		pbuf->Length = 0;
 874		pbuf->MaximumLength = 0;
 875		*pcur += sizeof(__le16);
 876	} else {
 877		len = cifs_strtoUTF16((__le16 *)*pcur,
 878				      str_value,
 879				      str_length,
 880				      nls_cp);
 881		len *= sizeof(__le16);
 882		pbuf->BufferOffset = cpu_to_le32(*pcur - pstart);
 883		pbuf->Length = cpu_to_le16(len);
 884		pbuf->MaximumLength = cpu_to_le16(len);
 885		*pcur += len;
 886	}
 887}
 888
 889/* BB Move to ntlmssp.c eventually */
 890
 891int build_ntlmssp_negotiate_blob(unsigned char **pbuffer,
 892				 u16 *buflen,
 893				 struct cifs_ses *ses,
 894				 struct TCP_Server_Info *server,
 895				 const struct nls_table *nls_cp)
 896{
 897	int rc = 0;
 898	NEGOTIATE_MESSAGE *sec_blob;
 899	__u32 flags;
 900	unsigned char *tmp;
 901	int len;
 902
 903	len = size_of_ntlmssp_blob(ses, sizeof(NEGOTIATE_MESSAGE));
 904	*pbuffer = kmalloc(len, GFP_KERNEL);
 905	if (!*pbuffer) {
 906		rc = -ENOMEM;
 907		cifs_dbg(VFS, "Error %d during NTLMSSP allocation\n", rc);
 908		*buflen = 0;
 909		goto setup_ntlm_neg_ret;
 910	}
 911	sec_blob = (NEGOTIATE_MESSAGE *)*pbuffer;
 912
 913	memset(*pbuffer, 0, sizeof(NEGOTIATE_MESSAGE));
 914	memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
 915	sec_blob->MessageType = NtLmNegotiate;
 916
 917	/* BB is NTLMV2 session security format easier to use here? */
 918	flags = NTLMSSP_NEGOTIATE_56 |	NTLMSSP_REQUEST_TARGET |
 919		NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
 920		NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC |
 921		NTLMSSP_NEGOTIATE_ALWAYS_SIGN | NTLMSSP_NEGOTIATE_SEAL |
 922		NTLMSSP_NEGOTIATE_SIGN;
 
 923	if (!server->session_estab || ses->ntlmssp->sesskey_per_smbsess)
 924		flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
 925
 926	tmp = *pbuffer + sizeof(NEGOTIATE_MESSAGE);
 927	ses->ntlmssp->client_flags = flags;
 928	sec_blob->NegotiateFlags = cpu_to_le32(flags);
 929
 930	/* these fields should be null in negotiate phase MS-NLMP 3.1.5.1.1 */
 931	cifs_security_buffer_from_str(&sec_blob->DomainName,
 932				      NULL,
 933				      CIFS_MAX_DOMAINNAME_LEN,
 934				      *pbuffer, &tmp,
 935				      nls_cp);
 936
 937	cifs_security_buffer_from_str(&sec_blob->WorkstationName,
 938				      NULL,
 939				      CIFS_MAX_WORKSTATION_LEN,
 940				      *pbuffer, &tmp,
 941				      nls_cp);
 942
 943	*buflen = tmp - *pbuffer;
 944setup_ntlm_neg_ret:
 945	return rc;
 
 946}
 947
 948/*
 949 * Build ntlmssp blob with additional fields, such as version,
 950 * supported by modern servers. For safety limit to SMB3 or later
 951 * See notes in MS-NLMP Section 2.2.2.1 e.g.
 952 */
 953int build_ntlmssp_smb3_negotiate_blob(unsigned char **pbuffer,
 954				 u16 *buflen,
 955				 struct cifs_ses *ses,
 956				 struct TCP_Server_Info *server,
 957				 const struct nls_table *nls_cp)
 958{
 959	int rc = 0;
 960	struct negotiate_message *sec_blob;
 961	__u32 flags;
 962	unsigned char *tmp;
 963	int len;
 964
 965	len = size_of_ntlmssp_blob(ses, sizeof(struct negotiate_message));
 966	*pbuffer = kmalloc(len, GFP_KERNEL);
 967	if (!*pbuffer) {
 968		rc = -ENOMEM;
 969		cifs_dbg(VFS, "Error %d during NTLMSSP allocation\n", rc);
 970		*buflen = 0;
 971		goto setup_ntlm_smb3_neg_ret;
 972	}
 973	sec_blob = (struct negotiate_message *)*pbuffer;
 974
 975	memset(*pbuffer, 0, sizeof(struct negotiate_message));
 976	memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
 977	sec_blob->MessageType = NtLmNegotiate;
 978
 979	/* BB is NTLMV2 session security format easier to use here? */
 980	flags = NTLMSSP_NEGOTIATE_56 |	NTLMSSP_REQUEST_TARGET |
 981		NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
 982		NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC |
 983		NTLMSSP_NEGOTIATE_ALWAYS_SIGN | NTLMSSP_NEGOTIATE_SEAL |
 984		NTLMSSP_NEGOTIATE_SIGN | NTLMSSP_NEGOTIATE_VERSION;
 985	if (!server->session_estab || ses->ntlmssp->sesskey_per_smbsess)
 986		flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
 987
 988	sec_blob->Version.ProductMajorVersion = LINUX_VERSION_MAJOR;
 989	sec_blob->Version.ProductMinorVersion = LINUX_VERSION_PATCHLEVEL;
 990	sec_blob->Version.ProductBuild = cpu_to_le16(SMB3_PRODUCT_BUILD);
 991	sec_blob->Version.NTLMRevisionCurrent = NTLMSSP_REVISION_W2K3;
 992
 993	tmp = *pbuffer + sizeof(struct negotiate_message);
 994	ses->ntlmssp->client_flags = flags;
 995	sec_blob->NegotiateFlags = cpu_to_le32(flags);
 
 996
 997	/* these fields should be null in negotiate phase MS-NLMP 3.1.5.1.1 */
 998	cifs_security_buffer_from_str(&sec_blob->DomainName,
 999				      NULL,
1000				      CIFS_MAX_DOMAINNAME_LEN,
1001				      *pbuffer, &tmp,
1002				      nls_cp);
1003
1004	cifs_security_buffer_from_str(&sec_blob->WorkstationName,
1005				      NULL,
1006				      CIFS_MAX_WORKSTATION_LEN,
1007				      *pbuffer, &tmp,
1008				      nls_cp);
1009
1010	*buflen = tmp - *pbuffer;
1011setup_ntlm_smb3_neg_ret:
1012	return rc;
1013}
1014
1015
1016int build_ntlmssp_auth_blob(unsigned char **pbuffer,
1017					u16 *buflen,
1018				   struct cifs_ses *ses,
1019				   struct TCP_Server_Info *server,
1020				   const struct nls_table *nls_cp)
1021{
1022	int rc;
1023	AUTHENTICATE_MESSAGE *sec_blob;
1024	__u32 flags;
1025	unsigned char *tmp;
1026	int len;
1027
1028	rc = setup_ntlmv2_rsp(ses, nls_cp);
1029	if (rc) {
1030		cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
1031		*buflen = 0;
1032		goto setup_ntlmv2_ret;
1033	}
1034
1035	len = size_of_ntlmssp_blob(ses, sizeof(AUTHENTICATE_MESSAGE));
1036	*pbuffer = kmalloc(len, GFP_KERNEL);
1037	if (!*pbuffer) {
1038		rc = -ENOMEM;
1039		cifs_dbg(VFS, "Error %d during NTLMSSP allocation\n", rc);
1040		*buflen = 0;
1041		goto setup_ntlmv2_ret;
1042	}
1043	sec_blob = (AUTHENTICATE_MESSAGE *)*pbuffer;
1044
1045	memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
1046	sec_blob->MessageType = NtLmAuthenticate;
1047
1048	flags = ses->ntlmssp->server_flags | NTLMSSP_REQUEST_TARGET |
1049		NTLMSSP_NEGOTIATE_TARGET_INFO | NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED;
 
 
 
 
 
 
 
1050
1051	tmp = *pbuffer + sizeof(AUTHENTICATE_MESSAGE);
1052	sec_blob->NegotiateFlags = cpu_to_le32(flags);
1053
1054	sec_blob->LmChallengeResponse.BufferOffset =
1055				cpu_to_le32(sizeof(AUTHENTICATE_MESSAGE));
1056	sec_blob->LmChallengeResponse.Length = 0;
1057	sec_blob->LmChallengeResponse.MaximumLength = 0;
1058
1059	sec_blob->NtChallengeResponse.BufferOffset =
1060				cpu_to_le32(tmp - *pbuffer);
1061	if (ses->user_name != NULL) {
1062		memcpy(tmp, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
1063				ses->auth_key.len - CIFS_SESS_KEY_SIZE);
1064		tmp += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
1065
1066		sec_blob->NtChallengeResponse.Length =
1067				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
1068		sec_blob->NtChallengeResponse.MaximumLength =
1069				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
1070	} else {
1071		/*
1072		 * don't send an NT Response for anonymous access
1073		 */
1074		sec_blob->NtChallengeResponse.Length = 0;
1075		sec_blob->NtChallengeResponse.MaximumLength = 0;
1076	}
1077
1078	cifs_security_buffer_from_str(&sec_blob->DomainName,
1079				      ses->domainName,
1080				      CIFS_MAX_DOMAINNAME_LEN,
1081				      *pbuffer, &tmp,
1082				      nls_cp);
1083
1084	cifs_security_buffer_from_str(&sec_blob->UserName,
1085				      ses->user_name,
1086				      CIFS_MAX_USERNAME_LEN,
1087				      *pbuffer, &tmp,
1088				      nls_cp);
1089
1090	cifs_security_buffer_from_str(&sec_blob->WorkstationName,
1091				      ses->workstation_name,
1092				      ntlmssp_workstation_name_size(ses),
1093				      *pbuffer, &tmp,
1094				      nls_cp);
1095
1096	if ((ses->ntlmssp->server_flags & NTLMSSP_NEGOTIATE_KEY_XCH) &&
1097	    (!ses->server->session_estab || ses->ntlmssp->sesskey_per_smbsess) &&
1098	    !calc_seckey(ses)) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1099		memcpy(tmp, ses->ntlmssp->ciphertext, CIFS_CPHTXT_SIZE);
1100		sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - *pbuffer);
1101		sec_blob->SessionKey.Length = cpu_to_le16(CIFS_CPHTXT_SIZE);
1102		sec_blob->SessionKey.MaximumLength =
1103				cpu_to_le16(CIFS_CPHTXT_SIZE);
1104		tmp += CIFS_CPHTXT_SIZE;
1105	} else {
1106		sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - *pbuffer);
1107		sec_blob->SessionKey.Length = 0;
1108		sec_blob->SessionKey.MaximumLength = 0;
1109	}
1110
1111	*buflen = tmp - *pbuffer;
1112setup_ntlmv2_ret:
1113	return rc;
1114}
1115
1116enum securityEnum
1117cifs_select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
1118{
1119	switch (server->negflavor) {
1120	case CIFS_NEGFLAVOR_EXTENDED:
1121		switch (requested) {
1122		case Kerberos:
1123		case RawNTLMSSP:
1124			return requested;
1125		case Unspecified:
1126			if (server->sec_ntlmssp &&
1127			    (global_secflags & CIFSSEC_MAY_NTLMSSP))
1128				return RawNTLMSSP;
1129			if ((server->sec_kerberos || server->sec_mskerberos) &&
1130			    (global_secflags & CIFSSEC_MAY_KRB5))
1131				return Kerberos;
1132			fallthrough;
1133		default:
1134			return Unspecified;
1135		}
1136	case CIFS_NEGFLAVOR_UNENCAP:
1137		switch (requested) {
 
1138		case NTLMv2:
1139			return requested;
1140		case Unspecified:
1141			if (global_secflags & CIFSSEC_MAY_NTLMV2)
1142				return NTLMv2;
 
 
1143			break;
1144		default:
1145			break;
1146		}
1147		fallthrough;
 
 
 
 
 
 
 
 
 
 
 
1148	default:
1149		return Unspecified;
1150	}
1151}
1152
1153struct sess_data {
1154	unsigned int xid;
1155	struct cifs_ses *ses;
1156	struct TCP_Server_Info *server;
1157	struct nls_table *nls_cp;
1158	void (*func)(struct sess_data *);
1159	int result;
1160
1161	/* we will send the SMB in three pieces:
1162	 * a fixed length beginning part, an optional
1163	 * SPNEGO blob (which can be zero length), and a
1164	 * last part which will include the strings
1165	 * and rest of bcc area. This allows us to avoid
1166	 * a large buffer 17K allocation
1167	 */
1168	int buf0_type;
1169	struct kvec iov[3];
1170};
1171
1172#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1173static int
1174sess_alloc_buffer(struct sess_data *sess_data, int wct)
1175{
1176	int rc;
1177	struct cifs_ses *ses = sess_data->ses;
1178	struct smb_hdr *smb_buf;
1179
1180	rc = small_smb_init_no_tc(SMB_COM_SESSION_SETUP_ANDX, wct, ses,
1181				  (void **)&smb_buf);
1182
1183	if (rc)
1184		return rc;
1185
1186	sess_data->iov[0].iov_base = (char *)smb_buf;
1187	sess_data->iov[0].iov_len = be32_to_cpu(smb_buf->smb_buf_length) + 4;
1188	/*
1189	 * This variable will be used to clear the buffer
1190	 * allocated above in case of any error in the calling function.
1191	 */
1192	sess_data->buf0_type = CIFS_SMALL_BUFFER;
1193
1194	/* 2000 big enough to fit max user, domain, NOS name etc. */
1195	sess_data->iov[2].iov_base = kmalloc(2000, GFP_KERNEL);
1196	if (!sess_data->iov[2].iov_base) {
1197		rc = -ENOMEM;
1198		goto out_free_smb_buf;
1199	}
1200
1201	return 0;
1202
1203out_free_smb_buf:
1204	cifs_small_buf_release(smb_buf);
1205	sess_data->iov[0].iov_base = NULL;
1206	sess_data->iov[0].iov_len = 0;
1207	sess_data->buf0_type = CIFS_NO_BUFFER;
1208	return rc;
1209}
1210
1211static void
1212sess_free_buffer(struct sess_data *sess_data)
1213{
1214	struct kvec *iov = sess_data->iov;
1215
1216	/*
1217	 * Zero the session data before freeing, as it might contain sensitive info (keys, etc).
1218	 * Note that iov[1] is already freed by caller.
1219	 */
1220	if (sess_data->buf0_type != CIFS_NO_BUFFER && iov[0].iov_base)
1221		memzero_explicit(iov[0].iov_base, iov[0].iov_len);
1222
1223	free_rsp_buf(sess_data->buf0_type, iov[0].iov_base);
1224	sess_data->buf0_type = CIFS_NO_BUFFER;
1225	kfree_sensitive(iov[2].iov_base);
1226}
1227
1228static int
1229sess_establish_session(struct sess_data *sess_data)
1230{
1231	struct cifs_ses *ses = sess_data->ses;
1232	struct TCP_Server_Info *server = sess_data->server;
1233
1234	cifs_server_lock(server);
1235	if (!server->session_estab) {
1236		if (server->sign) {
1237			server->session_key.response =
1238				kmemdup(ses->auth_key.response,
1239				ses->auth_key.len, GFP_KERNEL);
1240			if (!server->session_key.response) {
1241				cifs_server_unlock(server);
1242				return -ENOMEM;
1243			}
1244			server->session_key.len =
1245						ses->auth_key.len;
1246		}
1247		server->sequence_number = 0x2;
1248		server->session_estab = true;
1249	}
1250	cifs_server_unlock(server);
1251
1252	cifs_dbg(FYI, "CIFS session established successfully\n");
 
 
 
 
 
1253	return 0;
1254}
1255
1256static int
1257sess_sendreceive(struct sess_data *sess_data)
1258{
1259	int rc;
1260	struct smb_hdr *smb_buf = (struct smb_hdr *) sess_data->iov[0].iov_base;
1261	__u16 count;
1262	struct kvec rsp_iov = { NULL, 0 };
1263
1264	count = sess_data->iov[1].iov_len + sess_data->iov[2].iov_len;
1265	be32_add_cpu(&smb_buf->smb_buf_length, count);
1266	put_bcc(count, smb_buf);
1267
1268	rc = SendReceive2(sess_data->xid, sess_data->ses,
1269			  sess_data->iov, 3 /* num_iovecs */,
1270			  &sess_data->buf0_type,
1271			  CIFS_LOG_ERROR, &rsp_iov);
1272	cifs_small_buf_release(sess_data->iov[0].iov_base);
1273	memcpy(&sess_data->iov[0], &rsp_iov, sizeof(struct kvec));
1274
1275	return rc;
1276}
1277
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1278static void
1279sess_auth_ntlmv2(struct sess_data *sess_data)
1280{
1281	int rc = 0;
1282	struct smb_hdr *smb_buf;
1283	SESSION_SETUP_ANDX *pSMB;
1284	char *bcc_ptr;
1285	struct cifs_ses *ses = sess_data->ses;
1286	struct TCP_Server_Info *server = sess_data->server;
1287	__u32 capabilities;
1288	__u16 bytes_remaining;
1289
1290	/* old style NTLM sessionsetup */
1291	/* wct = 13 */
1292	rc = sess_alloc_buffer(sess_data, 13);
1293	if (rc)
1294		goto out;
1295
1296	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1297	bcc_ptr = sess_data->iov[2].iov_base;
1298	capabilities = cifs_ssetup_hdr(ses, server, pSMB);
1299
1300	pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
1301
1302	/* LM2 password would be here if we supported it */
1303	pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
1304
1305	if (ses->user_name != NULL) {
1306		/* calculate nlmv2 response and session key */
1307		rc = setup_ntlmv2_rsp(ses, sess_data->nls_cp);
1308		if (rc) {
1309			cifs_dbg(VFS, "Error %d during NTLMv2 authentication\n", rc);
1310			goto out;
1311		}
1312
1313		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
1314				ses->auth_key.len - CIFS_SESS_KEY_SIZE);
1315		bcc_ptr += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
1316
1317		/* set case sensitive password length after tilen may get
1318		 * assigned, tilen is 0 otherwise.
1319		 */
1320		pSMB->req_no_secext.CaseSensitivePasswordLength =
1321			cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
1322	} else {
1323		pSMB->req_no_secext.CaseSensitivePasswordLength = 0;
1324	}
1325
1326	if (ses->capabilities & CAP_UNICODE) {
1327		if (!IS_ALIGNED(sess_data->iov[0].iov_len, 2)) {
1328			*bcc_ptr = 0;
1329			bcc_ptr++;
1330		}
1331		unicode_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
1332	} else {
1333		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
1334	}
1335
1336
1337	sess_data->iov[2].iov_len = (long) bcc_ptr -
1338			(long) sess_data->iov[2].iov_base;
1339
1340	rc = sess_sendreceive(sess_data);
1341	if (rc)
1342		goto out;
1343
1344	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1345	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1346
1347	if (smb_buf->WordCount != 3) {
1348		rc = -EIO;
1349		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1350		goto out;
1351	}
1352
1353	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1354		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1355
1356	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1357	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1358
1359	bytes_remaining = get_bcc(smb_buf);
1360	bcc_ptr = pByteArea(smb_buf);
1361
1362	/* BB check if Unicode and decode strings */
1363	if (bytes_remaining == 0) {
1364		/* no string area to decode, do nothing */
1365	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1366		/* unicode string area must be word-aligned */
1367		if (!IS_ALIGNED((unsigned long)bcc_ptr - (unsigned long)smb_buf, 2)) {
1368			++bcc_ptr;
1369			--bytes_remaining;
1370		}
1371		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1372				      sess_data->nls_cp);
1373	} else {
1374		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1375				    sess_data->nls_cp);
1376	}
1377
1378	rc = sess_establish_session(sess_data);
1379out:
1380	sess_data->result = rc;
1381	sess_data->func = NULL;
1382	sess_free_buffer(sess_data);
1383	kfree_sensitive(ses->auth_key.response);
1384	ses->auth_key.response = NULL;
1385}
1386
1387#ifdef CONFIG_CIFS_UPCALL
1388static void
1389sess_auth_kerberos(struct sess_data *sess_data)
1390{
1391	int rc = 0;
1392	struct smb_hdr *smb_buf;
1393	SESSION_SETUP_ANDX *pSMB;
1394	char *bcc_ptr;
1395	struct cifs_ses *ses = sess_data->ses;
1396	struct TCP_Server_Info *server = sess_data->server;
1397	__u32 capabilities;
1398	__u16 bytes_remaining;
1399	struct key *spnego_key = NULL;
1400	struct cifs_spnego_msg *msg;
1401	u16 blob_len;
1402
1403	/* extended security */
1404	/* wct = 12 */
1405	rc = sess_alloc_buffer(sess_data, 12);
1406	if (rc)
1407		goto out;
1408
1409	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1410	bcc_ptr = sess_data->iov[2].iov_base;
1411	capabilities = cifs_ssetup_hdr(ses, server, pSMB);
1412
1413	spnego_key = cifs_get_spnego_key(ses, server);
1414	if (IS_ERR(spnego_key)) {
1415		rc = PTR_ERR(spnego_key);
1416		spnego_key = NULL;
1417		goto out;
1418	}
1419
1420	msg = spnego_key->payload.data[0];
1421	/*
1422	 * check version field to make sure that cifs.upcall is
1423	 * sending us a response in an expected form
1424	 */
1425	if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) {
1426		cifs_dbg(VFS, "incorrect version of cifs.upcall (expected %d but got %d)\n",
1427			 CIFS_SPNEGO_UPCALL_VERSION, msg->version);
1428		rc = -EKEYREJECTED;
1429		goto out_put_spnego_key;
1430	}
1431
1432	kfree_sensitive(ses->auth_key.response);
1433	ses->auth_key.response = kmemdup(msg->data, msg->sesskey_len,
1434					 GFP_KERNEL);
1435	if (!ses->auth_key.response) {
1436		cifs_dbg(VFS, "Kerberos can't allocate (%u bytes) memory\n",
1437			 msg->sesskey_len);
1438		rc = -ENOMEM;
1439		goto out_put_spnego_key;
1440	}
1441	ses->auth_key.len = msg->sesskey_len;
1442
1443	pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
1444	capabilities |= CAP_EXTENDED_SECURITY;
1445	pSMB->req.Capabilities = cpu_to_le32(capabilities);
1446	sess_data->iov[1].iov_base = msg->data + msg->sesskey_len;
1447	sess_data->iov[1].iov_len = msg->secblob_len;
1448	pSMB->req.SecurityBlobLength = cpu_to_le16(sess_data->iov[1].iov_len);
1449
1450	if (ses->capabilities & CAP_UNICODE) {
1451		/* unicode strings must be word aligned */
1452		if (!IS_ALIGNED(sess_data->iov[0].iov_len + sess_data->iov[1].iov_len, 2)) {
 
1453			*bcc_ptr = 0;
1454			bcc_ptr++;
1455		}
1456		unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp);
1457		unicode_domain_string(&bcc_ptr, ses, sess_data->nls_cp);
1458	} else {
1459		/* BB: is this right? */
1460		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
1461	}
1462
1463	sess_data->iov[2].iov_len = (long) bcc_ptr -
1464			(long) sess_data->iov[2].iov_base;
1465
1466	rc = sess_sendreceive(sess_data);
1467	if (rc)
1468		goto out_put_spnego_key;
1469
1470	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1471	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1472
1473	if (smb_buf->WordCount != 4) {
1474		rc = -EIO;
1475		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1476		goto out_put_spnego_key;
1477	}
1478
1479	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1480		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1481
1482	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1483	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1484
1485	bytes_remaining = get_bcc(smb_buf);
1486	bcc_ptr = pByteArea(smb_buf);
1487
1488	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1489	if (blob_len > bytes_remaining) {
1490		cifs_dbg(VFS, "bad security blob length %d\n",
1491				blob_len);
1492		rc = -EINVAL;
1493		goto out_put_spnego_key;
1494	}
1495	bcc_ptr += blob_len;
1496	bytes_remaining -= blob_len;
1497
1498	/* BB check if Unicode and decode strings */
1499	if (bytes_remaining == 0) {
1500		/* no string area to decode, do nothing */
1501	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1502		/* unicode string area must be word-aligned */
1503		if (!IS_ALIGNED((unsigned long)bcc_ptr - (unsigned long)smb_buf, 2)) {
1504			++bcc_ptr;
1505			--bytes_remaining;
1506		}
1507		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1508				      sess_data->nls_cp);
1509	} else {
1510		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1511				    sess_data->nls_cp);
1512	}
1513
1514	rc = sess_establish_session(sess_data);
1515out_put_spnego_key:
1516	key_invalidate(spnego_key);
1517	key_put(spnego_key);
1518out:
1519	sess_data->result = rc;
1520	sess_data->func = NULL;
1521	sess_free_buffer(sess_data);
1522	kfree_sensitive(ses->auth_key.response);
1523	ses->auth_key.response = NULL;
1524}
1525
1526#endif /* ! CONFIG_CIFS_UPCALL */
1527
1528/*
1529 * The required kvec buffers have to be allocated before calling this
1530 * function.
1531 */
1532static int
1533_sess_auth_rawntlmssp_assemble_req(struct sess_data *sess_data)
1534{
1535	SESSION_SETUP_ANDX *pSMB;
1536	struct cifs_ses *ses = sess_data->ses;
1537	struct TCP_Server_Info *server = sess_data->server;
1538	__u32 capabilities;
1539	char *bcc_ptr;
1540
1541	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1542
1543	capabilities = cifs_ssetup_hdr(ses, server, pSMB);
1544	if ((pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) == 0) {
1545		cifs_dbg(VFS, "NTLMSSP requires Unicode support\n");
1546		return -ENOSYS;
1547	}
1548
1549	pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
1550	capabilities |= CAP_EXTENDED_SECURITY;
1551	pSMB->req.Capabilities |= cpu_to_le32(capabilities);
1552
1553	bcc_ptr = sess_data->iov[2].iov_base;
1554	/* unicode strings must be word aligned */
1555	if (!IS_ALIGNED(sess_data->iov[0].iov_len + sess_data->iov[1].iov_len, 2)) {
1556		*bcc_ptr = 0;
1557		bcc_ptr++;
1558	}
1559	unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp);
1560
1561	sess_data->iov[2].iov_len = (long) bcc_ptr -
1562					(long) sess_data->iov[2].iov_base;
1563
1564	return 0;
1565}
1566
1567static void
1568sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data);
1569
1570static void
1571sess_auth_rawntlmssp_negotiate(struct sess_data *sess_data)
1572{
1573	int rc;
1574	struct smb_hdr *smb_buf;
1575	SESSION_SETUP_ANDX *pSMB;
1576	struct cifs_ses *ses = sess_data->ses;
1577	struct TCP_Server_Info *server = sess_data->server;
1578	__u16 bytes_remaining;
1579	char *bcc_ptr;
1580	unsigned char *ntlmsspblob = NULL;
1581	u16 blob_len;
1582
1583	cifs_dbg(FYI, "rawntlmssp session setup negotiate phase\n");
1584
1585	/*
1586	 * if memory allocation is successful, caller of this function
1587	 * frees it.
1588	 */
1589	ses->ntlmssp = kmalloc(sizeof(struct ntlmssp_auth), GFP_KERNEL);
1590	if (!ses->ntlmssp) {
1591		rc = -ENOMEM;
1592		goto out;
1593	}
1594	ses->ntlmssp->sesskey_per_smbsess = false;
1595
1596	/* wct = 12 */
1597	rc = sess_alloc_buffer(sess_data, 12);
1598	if (rc)
1599		goto out;
1600
1601	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1602
1603	/* Build security blob before we assemble the request */
1604	rc = build_ntlmssp_negotiate_blob(&ntlmsspblob,
1605				     &blob_len, ses, server,
1606				     sess_data->nls_cp);
1607	if (rc)
1608		goto out_free_ntlmsspblob;
1609
1610	sess_data->iov[1].iov_len = blob_len;
1611	sess_data->iov[1].iov_base = ntlmsspblob;
1612	pSMB->req.SecurityBlobLength = cpu_to_le16(blob_len);
1613
1614	rc = _sess_auth_rawntlmssp_assemble_req(sess_data);
1615	if (rc)
1616		goto out_free_ntlmsspblob;
1617
1618	rc = sess_sendreceive(sess_data);
1619
1620	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1621	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1622
1623	/* If true, rc here is expected and not an error */
1624	if (sess_data->buf0_type != CIFS_NO_BUFFER &&
1625	    smb_buf->Status.CifsError ==
1626			cpu_to_le32(NT_STATUS_MORE_PROCESSING_REQUIRED))
1627		rc = 0;
1628
1629	if (rc)
1630		goto out_free_ntlmsspblob;
1631
1632	cifs_dbg(FYI, "rawntlmssp session setup challenge phase\n");
1633
1634	if (smb_buf->WordCount != 4) {
1635		rc = -EIO;
1636		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1637		goto out_free_ntlmsspblob;
1638	}
1639
1640	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1641	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1642
1643	bytes_remaining = get_bcc(smb_buf);
1644	bcc_ptr = pByteArea(smb_buf);
1645
1646	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1647	if (blob_len > bytes_remaining) {
1648		cifs_dbg(VFS, "bad security blob length %d\n",
1649				blob_len);
1650		rc = -EINVAL;
1651		goto out_free_ntlmsspblob;
1652	}
1653
1654	rc = decode_ntlmssp_challenge(bcc_ptr, blob_len, ses);
1655
1656out_free_ntlmsspblob:
1657	kfree_sensitive(ntlmsspblob);
1658out:
1659	sess_free_buffer(sess_data);
1660
1661	if (!rc) {
1662		sess_data->func = sess_auth_rawntlmssp_authenticate;
1663		return;
1664	}
1665
1666	/* Else error. Cleanup */
1667	kfree_sensitive(ses->auth_key.response);
1668	ses->auth_key.response = NULL;
1669	kfree_sensitive(ses->ntlmssp);
1670	ses->ntlmssp = NULL;
1671
1672	sess_data->func = NULL;
1673	sess_data->result = rc;
1674}
1675
1676static void
1677sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data)
1678{
1679	int rc;
1680	struct smb_hdr *smb_buf;
1681	SESSION_SETUP_ANDX *pSMB;
1682	struct cifs_ses *ses = sess_data->ses;
1683	struct TCP_Server_Info *server = sess_data->server;
1684	__u16 bytes_remaining;
1685	char *bcc_ptr;
1686	unsigned char *ntlmsspblob = NULL;
1687	u16 blob_len;
1688
1689	cifs_dbg(FYI, "rawntlmssp session setup authenticate phase\n");
1690
1691	/* wct = 12 */
1692	rc = sess_alloc_buffer(sess_data, 12);
1693	if (rc)
1694		goto out;
1695
1696	/* Build security blob before we assemble the request */
1697	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1698	smb_buf = (struct smb_hdr *)pSMB;
1699	rc = build_ntlmssp_auth_blob(&ntlmsspblob,
1700					&blob_len, ses, server,
1701					sess_data->nls_cp);
1702	if (rc)
1703		goto out_free_ntlmsspblob;
1704	sess_data->iov[1].iov_len = blob_len;
1705	sess_data->iov[1].iov_base = ntlmsspblob;
1706	pSMB->req.SecurityBlobLength = cpu_to_le16(blob_len);
1707	/*
1708	 * Make sure that we tell the server that we are using
1709	 * the uid that it just gave us back on the response
1710	 * (challenge)
1711	 */
1712	smb_buf->Uid = ses->Suid;
1713
1714	rc = _sess_auth_rawntlmssp_assemble_req(sess_data);
1715	if (rc)
1716		goto out_free_ntlmsspblob;
1717
1718	rc = sess_sendreceive(sess_data);
1719	if (rc)
1720		goto out_free_ntlmsspblob;
1721
1722	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1723	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1724	if (smb_buf->WordCount != 4) {
1725		rc = -EIO;
1726		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1727		goto out_free_ntlmsspblob;
1728	}
1729
1730	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1731		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1732
1733	if (ses->Suid != smb_buf->Uid) {
1734		ses->Suid = smb_buf->Uid;
1735		cifs_dbg(FYI, "UID changed! new UID = %llu\n", ses->Suid);
1736	}
1737
1738	bytes_remaining = get_bcc(smb_buf);
1739	bcc_ptr = pByteArea(smb_buf);
1740	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1741	if (blob_len > bytes_remaining) {
1742		cifs_dbg(VFS, "bad security blob length %d\n",
1743				blob_len);
1744		rc = -EINVAL;
1745		goto out_free_ntlmsspblob;
1746	}
1747	bcc_ptr += blob_len;
1748	bytes_remaining -= blob_len;
1749
1750
1751	/* BB check if Unicode and decode strings */
1752	if (bytes_remaining == 0) {
1753		/* no string area to decode, do nothing */
1754	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1755		/* unicode string area must be word-aligned */
1756		if (!IS_ALIGNED((unsigned long)bcc_ptr - (unsigned long)smb_buf, 2)) {
1757			++bcc_ptr;
1758			--bytes_remaining;
1759		}
1760		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1761				      sess_data->nls_cp);
1762	} else {
1763		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1764				    sess_data->nls_cp);
1765	}
1766
1767out_free_ntlmsspblob:
1768	kfree_sensitive(ntlmsspblob);
1769out:
1770	sess_free_buffer(sess_data);
1771
1772	if (!rc)
1773		rc = sess_establish_session(sess_data);
1774
1775	/* Cleanup */
1776	kfree_sensitive(ses->auth_key.response);
1777	ses->auth_key.response = NULL;
1778	kfree_sensitive(ses->ntlmssp);
1779	ses->ntlmssp = NULL;
1780
1781	sess_data->func = NULL;
1782	sess_data->result = rc;
1783}
1784
1785static int select_sec(struct sess_data *sess_data)
1786{
1787	int type;
1788	struct cifs_ses *ses = sess_data->ses;
1789	struct TCP_Server_Info *server = sess_data->server;
1790
1791	type = cifs_select_sectype(server, ses->sectype);
1792	cifs_dbg(FYI, "sess setup type %d\n", type);
1793	if (type == Unspecified) {
1794		cifs_dbg(VFS, "Unable to select appropriate authentication method!\n");
1795		return -EINVAL;
1796	}
1797
1798	switch (type) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1799	case NTLMv2:
1800		sess_data->func = sess_auth_ntlmv2;
1801		break;
1802	case Kerberos:
1803#ifdef CONFIG_CIFS_UPCALL
1804		sess_data->func = sess_auth_kerberos;
1805		break;
1806#else
1807		cifs_dbg(VFS, "Kerberos negotiated but upcall support disabled!\n");
1808		return -ENOSYS;
1809#endif /* CONFIG_CIFS_UPCALL */
1810	case RawNTLMSSP:
1811		sess_data->func = sess_auth_rawntlmssp_negotiate;
1812		break;
1813	default:
1814		cifs_dbg(VFS, "secType %d not supported!\n", type);
1815		return -ENOSYS;
1816	}
1817
1818	return 0;
1819}
1820
1821int CIFS_SessSetup(const unsigned int xid, struct cifs_ses *ses,
1822		   struct TCP_Server_Info *server,
1823		   const struct nls_table *nls_cp)
1824{
1825	int rc = 0;
1826	struct sess_data *sess_data;
1827
1828	if (ses == NULL) {
1829		WARN(1, "%s: ses == NULL!", __func__);
1830		return -EINVAL;
1831	}
1832
1833	sess_data = kzalloc(sizeof(struct sess_data), GFP_KERNEL);
1834	if (!sess_data)
1835		return -ENOMEM;
1836
 
 
 
 
1837	sess_data->xid = xid;
1838	sess_data->ses = ses;
1839	sess_data->server = server;
1840	sess_data->buf0_type = CIFS_NO_BUFFER;
1841	sess_data->nls_cp = (struct nls_table *) nls_cp;
1842
1843	rc = select_sec(sess_data);
1844	if (rc)
1845		goto out;
1846
1847	while (sess_data->func)
1848		sess_data->func(sess_data);
1849
1850	/* Store result before we free sess_data */
1851	rc = sess_data->result;
1852
1853out:
1854	kfree_sensitive(sess_data);
1855	return rc;
1856}
1857#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
v5.14.15
   1// SPDX-License-Identifier: LGPL-2.1
   2/*
   3 *   fs/cifs/sess.c
   4 *
   5 *   SMB/CIFS session setup handling routines
   6 *
   7 *   Copyright (c) International Business Machines  Corp., 2006, 2009
   8 *   Author(s): Steve French (sfrench@us.ibm.com)
   9 *
  10 */
  11
  12#include "cifspdu.h"
  13#include "cifsglob.h"
  14#include "cifsproto.h"
  15#include "cifs_unicode.h"
  16#include "cifs_debug.h"
  17#include "ntlmssp.h"
  18#include "nterr.h"
  19#include <linux/utsname.h>
  20#include <linux/slab.h>
 
 
  21#include "cifs_spnego.h"
  22#include "smb2proto.h"
  23#include "fs_context.h"
  24
  25static int
  26cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
  27		     struct cifs_server_iface *iface);
  28
  29bool
  30is_server_using_iface(struct TCP_Server_Info *server,
  31		      struct cifs_server_iface *iface)
  32{
  33	struct sockaddr_in *i4 = (struct sockaddr_in *)&iface->sockaddr;
  34	struct sockaddr_in6 *i6 = (struct sockaddr_in6 *)&iface->sockaddr;
  35	struct sockaddr_in *s4 = (struct sockaddr_in *)&server->dstaddr;
  36	struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)&server->dstaddr;
  37
  38	if (server->dstaddr.ss_family != iface->sockaddr.ss_family)
  39		return false;
  40	if (server->dstaddr.ss_family == AF_INET) {
  41		if (s4->sin_addr.s_addr != i4->sin_addr.s_addr)
  42			return false;
  43	} else if (server->dstaddr.ss_family == AF_INET6) {
  44		if (memcmp(&s6->sin6_addr, &i6->sin6_addr,
  45			   sizeof(i6->sin6_addr)) != 0)
  46			return false;
  47	} else {
  48		/* unknown family.. */
  49		return false;
  50	}
  51	return true;
  52}
  53
  54bool is_ses_using_iface(struct cifs_ses *ses, struct cifs_server_iface *iface)
  55{
  56	int i;
  57
 
  58	for (i = 0; i < ses->chan_count; i++) {
  59		if (is_server_using_iface(ses->chans[i].server, iface))
 
  60			return true;
 
  61	}
 
  62	return false;
  63}
  64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  65/* returns number of channels added */
  66int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses)
  67{
  68	int old_chan_count = ses->chan_count;
  69	int left = ses->chan_max - ses->chan_count;
  70	int i = 0;
  71	int rc = 0;
  72	int tries = 0;
  73	struct cifs_server_iface *ifaces = NULL;
  74	size_t iface_count;
 
 
 
 
  75
  76	if (left <= 0) {
 
  77		cifs_dbg(FYI,
  78			 "ses already at max_channels (%zu), nothing to open\n",
  79			 ses->chan_max);
  80		return 0;
  81	}
  82
  83	if (ses->server->dialect < SMB30_PROT_ID) {
 
  84		cifs_dbg(VFS, "multichannel is not supported on this protocol version, use 3.0 or above\n");
  85		return 0;
  86	}
  87
  88	if (!(ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) {
 
 
  89		cifs_dbg(VFS, "server %s does not support multichannel\n", ses->server->hostname);
  90		ses->chan_max = 1;
  91		return 0;
  92	}
 
  93
  94	/*
  95	 * Make a copy of the iface list at the time and use that
  96	 * instead so as to not hold the iface spinlock for opening
  97	 * channels
  98	 */
  99	spin_lock(&ses->iface_lock);
 100	iface_count = ses->iface_count;
 101	if (iface_count <= 0) {
 102		spin_unlock(&ses->iface_lock);
 103		cifs_dbg(VFS, "no iface list available to open channels\n");
 104		return 0;
 105	}
 106	ifaces = kmemdup(ses->iface_list, iface_count*sizeof(*ifaces),
 107			 GFP_ATOMIC);
 108	if (!ifaces) {
 109		spin_unlock(&ses->iface_lock);
 110		return 0;
 111	}
 112	spin_unlock(&ses->iface_lock);
 113
 114	/*
 115	 * Keep connecting to same, fastest, iface for all channels as
 116	 * long as its RSS. Try next fastest one if not RSS or channel
 117	 * creation fails.
 118	 */
 119	while (left > 0) {
 120		struct cifs_server_iface *iface;
 121
 122		tries++;
 123		if (tries > 3*ses->chan_max) {
 124			cifs_dbg(FYI, "too many channel open attempts (%d channels left to open)\n",
 125				 left);
 126			break;
 127		}
 128
 129		iface = &ifaces[i];
 130		if (is_ses_using_iface(ses, iface) && !iface->rss_capable) {
 131			i = (i+1) % iface_count;
 132			continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 133		}
 
 
 134
 135		rc = cifs_ses_add_channel(cifs_sb, ses, iface);
 136		if (rc) {
 137			cifs_dbg(FYI, "failed to open extra channel on iface#%d rc=%d\n",
 138				 i, rc);
 139			i = (i+1) % iface_count;
 
 140			continue;
 141		}
 
 
 
 142
 143		cifs_dbg(FYI, "successfully opened new channel on iface#%d\n",
 144			 i);
 145		left--;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 146	}
 
 147
 148	kfree(ifaces);
 149	return ses->chan_count - old_chan_count;
 
 
 
 
 
 
 
 
 
 
 
 
 150}
 151
 152/*
 153 * If server is a channel of ses, return the corresponding enclosing
 154 * cifs_chan otherwise return NULL.
 155 */
 156struct cifs_chan *
 157cifs_ses_find_chan(struct cifs_ses *ses, struct TCP_Server_Info *server)
 158{
 159	int i;
 160
 
 161	for (i = 0; i < ses->chan_count; i++) {
 162		if (ses->chans[i].server == server)
 
 163			return &ses->chans[i];
 
 164	}
 
 165	return NULL;
 166}
 167
 168static int
 169cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
 170		     struct cifs_server_iface *iface)
 171{
 
 172	struct cifs_chan *chan;
 173	struct smb3_fs_context ctx = {NULL};
 174	static const char unc_fmt[] = "\\%s\\foo";
 175	char unc[sizeof(unc_fmt)+SERVER_NAME_LEN_WITH_NULL] = {0};
 176	struct sockaddr_in *ipv4 = (struct sockaddr_in *)&iface->sockaddr;
 177	struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&iface->sockaddr;
 178	int rc;
 179	unsigned int xid = get_xid();
 180
 181	if (iface->sockaddr.ss_family == AF_INET)
 182		cifs_dbg(FYI, "adding channel to ses %p (speed:%zu bps rdma:%s ip:%pI4)\n",
 183			 ses, iface->speed, iface->rdma_capable ? "yes" : "no",
 184			 &ipv4->sin_addr);
 185	else
 186		cifs_dbg(FYI, "adding channel to ses %p (speed:%zu bps rdma:%s ip:%pI6)\n",
 187			 ses, iface->speed, iface->rdma_capable ? "yes" : "no",
 188			 &ipv6->sin6_addr);
 189
 190	/*
 191	 * Setup a ctx with mostly the same info as the existing
 192	 * session and overwrite it with the requested iface data.
 193	 *
 194	 * We need to setup at least the fields used for negprot and
 195	 * sesssetup.
 196	 *
 197	 * We only need the ctx here, so we can reuse memory from
 198	 * the session and server without caring about memory
 199	 * management.
 200	 */
 201
 202	/* Always make new connection for now (TODO?) */
 203	ctx.nosharesock = true;
 204
 205	/* Auth */
 206	ctx.domainauto = ses->domainAuto;
 207	ctx.domainname = ses->domainName;
 
 
 
 
 208	ctx.username = ses->user_name;
 209	ctx.password = ses->password;
 210	ctx.sectype = ses->sectype;
 211	ctx.sign = ses->sign;
 212
 213	/* UNC and paths */
 214	/* XXX: Use ses->server->hostname? */
 215	sprintf(unc, unc_fmt, ses->ip_addr);
 216	ctx.UNC = unc;
 217	ctx.prepath = "";
 218
 219	/* Reuse same version as master connection */
 220	ctx.vals = ses->server->vals;
 221	ctx.ops = ses->server->ops;
 222
 223	ctx.noblocksnd = ses->server->noblocksnd;
 224	ctx.noautotune = ses->server->noautotune;
 225	ctx.sockopt_tcp_nodelay = ses->server->tcp_nodelay;
 226	ctx.echo_interval = ses->server->echo_interval / HZ;
 227	ctx.max_credits = ses->server->max_credits;
 228
 229	/*
 230	 * This will be used for encoding/decoding user/domain/pw
 231	 * during sess setup auth.
 232	 */
 233	ctx.local_nls = cifs_sb->local_nls;
 234
 235	/* Use RDMA if possible */
 236	ctx.rdma = iface->rdma_capable;
 237	memcpy(&ctx.dstaddr, &iface->sockaddr, sizeof(struct sockaddr_storage));
 238
 239	/* reuse master con client guid */
 240	memcpy(&ctx.client_guid, ses->server->client_guid,
 241	       SMB2_CLIENT_GUID_SIZE);
 242	ctx.use_client_guid = true;
 243
 244	mutex_lock(&ses->session_mutex);
 245
 246	chan = ses->binding_chan = &ses->chans[ses->chan_count];
 247	chan->server = cifs_get_tcp_session(&ctx);
 
 248	if (IS_ERR(chan->server)) {
 249		rc = PTR_ERR(chan->server);
 250		chan->server = NULL;
 
 251		goto out;
 252	}
 253	spin_lock(&cifs_tcp_ses_lock);
 254	chan->server->is_channel = true;
 255	spin_unlock(&cifs_tcp_ses_lock);
 
 
 
 
 
 256
 
 257	/*
 258	 * We need to allocate the server crypto now as we will need
 259	 * to sign packets before we generate the channel signing key
 260	 * (we sign with the session key)
 261	 */
 262	rc = smb311_crypto_shash_allocate(chan->server);
 263	if (rc) {
 264		cifs_dbg(VFS, "%s: crypto alloc failed\n", __func__);
 
 265		goto out;
 266	}
 267
 268	ses->binding = true;
 269	rc = cifs_negotiate_protocol(xid, ses);
 270	if (rc)
 271		goto out;
 272
 273	rc = cifs_setup_session(xid, ses, cifs_sb->local_nls);
 274	if (rc)
 275		goto out;
 276
 277	/* success, put it on the list
 278	 * XXX: sharing ses between 2 tcp servers is not possible, the
 279	 * way "internal" linked lists works in linux makes element
 280	 * only able to belong to one list
 281	 *
 282	 * the binding session is already established so the rest of
 283	 * the code should be able to look it up, no need to add the
 284	 * ses to the new server.
 285	 */
 286
 287	ses->chan_count++;
 288	atomic_set(&ses->chan_seq, 0);
 289out:
 290	ses->binding = false;
 291	ses->binding_chan = NULL;
 292	mutex_unlock(&ses->session_mutex);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 293
 294	if (rc && chan->server)
 295		cifs_put_tcp_session(chan->server, 0);
 
 296
 
 297	return rc;
 298}
 299
 300static __u32 cifs_ssetup_hdr(struct cifs_ses *ses, SESSION_SETUP_ANDX *pSMB)
 
 
 
 301{
 302	__u32 capabilities = 0;
 303
 304	/* init fields common to all four types of SessSetup */
 305	/* Note that offsets for first seven fields in req struct are same  */
 306	/*	in CIFS Specs so does not matter which of 3 forms of struct */
 307	/*	that we use in next few lines                               */
 308	/* Note that header is initialized to zero in header_assemble */
 309	pSMB->req.AndXCommand = 0xFF;
 310	pSMB->req.MaxBufferSize = cpu_to_le16(min_t(u32,
 311					CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4,
 312					USHRT_MAX));
 313	pSMB->req.MaxMpxCount = cpu_to_le16(ses->server->maxReq);
 314	pSMB->req.VcNumber = cpu_to_le16(1);
 315
 316	/* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */
 317
 318	/* BB verify whether signing required on neg or just on auth frame
 319	   (and NTLM case) */
 320
 321	capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS |
 322			CAP_LARGE_WRITE_X | CAP_LARGE_READ_X;
 323
 324	if (ses->server->sign)
 325		pSMB->req.hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
 326
 327	if (ses->capabilities & CAP_UNICODE) {
 328		pSMB->req.hdr.Flags2 |= SMBFLG2_UNICODE;
 329		capabilities |= CAP_UNICODE;
 330	}
 331	if (ses->capabilities & CAP_STATUS32) {
 332		pSMB->req.hdr.Flags2 |= SMBFLG2_ERR_STATUS;
 333		capabilities |= CAP_STATUS32;
 334	}
 335	if (ses->capabilities & CAP_DFS) {
 336		pSMB->req.hdr.Flags2 |= SMBFLG2_DFS;
 337		capabilities |= CAP_DFS;
 338	}
 339	if (ses->capabilities & CAP_UNIX)
 340		capabilities |= CAP_UNIX;
 341
 342	return capabilities;
 343}
 344
 345static void
 346unicode_oslm_strings(char **pbcc_area, const struct nls_table *nls_cp)
 347{
 348	char *bcc_ptr = *pbcc_area;
 349	int bytes_ret = 0;
 350
 351	/* Copy OS version */
 352	bytes_ret = cifs_strtoUTF16((__le16 *)bcc_ptr, "Linux version ", 32,
 353				    nls_cp);
 354	bcc_ptr += 2 * bytes_ret;
 355	bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, init_utsname()->release,
 356				    32, nls_cp);
 357	bcc_ptr += 2 * bytes_ret;
 358	bcc_ptr += 2; /* trailing null */
 359
 360	bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS,
 361				    32, nls_cp);
 362	bcc_ptr += 2 * bytes_ret;
 363	bcc_ptr += 2; /* trailing null */
 364
 365	*pbcc_area = bcc_ptr;
 366}
 367
 368static void unicode_domain_string(char **pbcc_area, struct cifs_ses *ses,
 369				   const struct nls_table *nls_cp)
 370{
 371	char *bcc_ptr = *pbcc_area;
 372	int bytes_ret = 0;
 373
 374	/* copy domain */
 375	if (ses->domainName == NULL) {
 376		/* Sending null domain better than using a bogus domain name (as
 377		we did briefly in 2.6.18) since server will use its default */
 378		*bcc_ptr = 0;
 379		*(bcc_ptr+1) = 0;
 380		bytes_ret = 0;
 381	} else
 382		bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->domainName,
 383					    CIFS_MAX_DOMAINNAME_LEN, nls_cp);
 384	bcc_ptr += 2 * bytes_ret;
 385	bcc_ptr += 2;  /* account for null terminator */
 386
 387	*pbcc_area = bcc_ptr;
 388}
 389
 390
 391static void unicode_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
 392				   const struct nls_table *nls_cp)
 393{
 394	char *bcc_ptr = *pbcc_area;
 395	int bytes_ret = 0;
 396
 397	/* BB FIXME add check that strings total less
 398	than 335 or will need to send them as arrays */
 399
 400	/* unicode strings, must be word aligned before the call */
 401/*	if ((long) bcc_ptr % 2)	{
 402		*bcc_ptr = 0;
 403		bcc_ptr++;
 404	} */
 405	/* copy user */
 406	if (ses->user_name == NULL) {
 407		/* null user mount */
 408		*bcc_ptr = 0;
 409		*(bcc_ptr+1) = 0;
 410	} else {
 411		bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->user_name,
 412					    CIFS_MAX_USERNAME_LEN, nls_cp);
 413	}
 414	bcc_ptr += 2 * bytes_ret;
 415	bcc_ptr += 2; /* account for null termination */
 416
 417	unicode_domain_string(&bcc_ptr, ses, nls_cp);
 418	unicode_oslm_strings(&bcc_ptr, nls_cp);
 419
 420	*pbcc_area = bcc_ptr;
 421}
 422
 423static void ascii_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
 424				 const struct nls_table *nls_cp)
 425{
 426	char *bcc_ptr = *pbcc_area;
 427	int len;
 428
 429	/* copy user */
 430	/* BB what about null user mounts - check that we do this BB */
 431	/* copy user */
 432	if (ses->user_name != NULL) {
 433		len = strscpy(bcc_ptr, ses->user_name, CIFS_MAX_USERNAME_LEN);
 434		if (WARN_ON_ONCE(len < 0))
 435			len = CIFS_MAX_USERNAME_LEN - 1;
 436		bcc_ptr += len;
 437	}
 438	/* else null user mount */
 439	*bcc_ptr = 0;
 440	bcc_ptr++; /* account for null termination */
 441
 442	/* copy domain */
 443	if (ses->domainName != NULL) {
 444		len = strscpy(bcc_ptr, ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
 445		if (WARN_ON_ONCE(len < 0))
 446			len = CIFS_MAX_DOMAINNAME_LEN - 1;
 447		bcc_ptr += len;
 448	} /* else we will send a null domain name
 449	     so the server will default to its own domain */
 450	*bcc_ptr = 0;
 451	bcc_ptr++;
 452
 453	/* BB check for overflow here */
 454
 455	strcpy(bcc_ptr, "Linux version ");
 456	bcc_ptr += strlen("Linux version ");
 457	strcpy(bcc_ptr, init_utsname()->release);
 458	bcc_ptr += strlen(init_utsname()->release) + 1;
 459
 460	strcpy(bcc_ptr, CIFS_NETWORK_OPSYS);
 461	bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1;
 462
 463	*pbcc_area = bcc_ptr;
 464}
 465
 466static void
 467decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifs_ses *ses,
 468		      const struct nls_table *nls_cp)
 469{
 470	int len;
 471	char *data = *pbcc_area;
 472
 473	cifs_dbg(FYI, "bleft %d\n", bleft);
 474
 475	kfree(ses->serverOS);
 476	ses->serverOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
 477	cifs_dbg(FYI, "serverOS=%s\n", ses->serverOS);
 478	len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
 479	data += len;
 480	bleft -= len;
 481	if (bleft <= 0)
 482		return;
 483
 484	kfree(ses->serverNOS);
 485	ses->serverNOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
 486	cifs_dbg(FYI, "serverNOS=%s\n", ses->serverNOS);
 487	len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
 488	data += len;
 489	bleft -= len;
 490	if (bleft <= 0)
 491		return;
 492
 493	kfree(ses->serverDomain);
 494	ses->serverDomain = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
 495	cifs_dbg(FYI, "serverDomain=%s\n", ses->serverDomain);
 496
 497	return;
 498}
 499
 500static void decode_ascii_ssetup(char **pbcc_area, __u16 bleft,
 501				struct cifs_ses *ses,
 502				const struct nls_table *nls_cp)
 503{
 504	int len;
 505	char *bcc_ptr = *pbcc_area;
 506
 507	cifs_dbg(FYI, "decode sessetup ascii. bleft %d\n", bleft);
 508
 509	len = strnlen(bcc_ptr, bleft);
 510	if (len >= bleft)
 511		return;
 512
 513	kfree(ses->serverOS);
 514
 515	ses->serverOS = kmalloc(len + 1, GFP_KERNEL);
 516	if (ses->serverOS) {
 517		memcpy(ses->serverOS, bcc_ptr, len);
 518		ses->serverOS[len] = 0;
 519		if (strncmp(ses->serverOS, "OS/2", 4) == 0)
 520			cifs_dbg(FYI, "OS/2 server\n");
 521	}
 522
 523	bcc_ptr += len + 1;
 524	bleft -= len + 1;
 525
 526	len = strnlen(bcc_ptr, bleft);
 527	if (len >= bleft)
 528		return;
 529
 530	kfree(ses->serverNOS);
 531
 532	ses->serverNOS = kmalloc(len + 1, GFP_KERNEL);
 533	if (ses->serverNOS) {
 534		memcpy(ses->serverNOS, bcc_ptr, len);
 535		ses->serverNOS[len] = 0;
 536	}
 537
 538	bcc_ptr += len + 1;
 539	bleft -= len + 1;
 540
 541	len = strnlen(bcc_ptr, bleft);
 542	if (len > bleft)
 543		return;
 544
 545	/* No domain field in LANMAN case. Domain is
 546	   returned by old servers in the SMB negprot response */
 547	/* BB For newer servers which do not support Unicode,
 548	   but thus do return domain here we could add parsing
 549	   for it later, but it is not very important */
 550	cifs_dbg(FYI, "ascii: bytes left %d\n", bleft);
 551}
 
 552
 553int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len,
 554				    struct cifs_ses *ses)
 555{
 556	unsigned int tioffset; /* challenge message target info area */
 557	unsigned int tilen; /* challenge message target info area length  */
 558
 559	CHALLENGE_MESSAGE *pblob = (CHALLENGE_MESSAGE *)bcc_ptr;
 
 560
 561	if (blob_len < sizeof(CHALLENGE_MESSAGE)) {
 562		cifs_dbg(VFS, "challenge blob len %d too small\n", blob_len);
 563		return -EINVAL;
 564	}
 565
 566	if (memcmp(pblob->Signature, "NTLMSSP", 8)) {
 567		cifs_dbg(VFS, "blob signature incorrect %s\n",
 568			 pblob->Signature);
 569		return -EINVAL;
 570	}
 571	if (pblob->MessageType != NtLmChallenge) {
 572		cifs_dbg(VFS, "Incorrect message type %d\n",
 573			 pblob->MessageType);
 574		return -EINVAL;
 575	}
 576
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 577	memcpy(ses->ntlmssp->cryptkey, pblob->Challenge, CIFS_CRYPTO_KEY_SIZE);
 578	/* BB we could decode pblob->NegotiateFlags; some may be useful */
 579	/* In particular we can examine sign flags */
 580	/* BB spec says that if AvId field of MsvAvTimestamp is populated then
 581		we must set the MIC field of the AUTHENTICATE_MESSAGE */
 582	ses->ntlmssp->server_flags = le32_to_cpu(pblob->NegotiateFlags);
 583	tioffset = le32_to_cpu(pblob->TargetInfoArray.BufferOffset);
 584	tilen = le16_to_cpu(pblob->TargetInfoArray.Length);
 585	if (tioffset > blob_len || tioffset + tilen > blob_len) {
 586		cifs_dbg(VFS, "tioffset + tilen too high %u + %u\n",
 587			 tioffset, tilen);
 588		return -EINVAL;
 589	}
 590	if (tilen) {
 
 591		ses->auth_key.response = kmemdup(bcc_ptr + tioffset, tilen,
 592						 GFP_KERNEL);
 593		if (!ses->auth_key.response) {
 594			cifs_dbg(VFS, "Challenge target info alloc failure\n");
 595			return -ENOMEM;
 596		}
 597		ses->auth_key.len = tilen;
 598	}
 599
 600	return 0;
 601}
 602
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 603/* BB Move to ntlmssp.c eventually */
 604
 605/* We do not malloc the blob, it is passed in pbuffer, because
 606   it is fixed size, and small, making this approach cleaner */
 607void build_ntlmssp_negotiate_blob(unsigned char *pbuffer,
 608					 struct cifs_ses *ses)
 
 609{
 610	struct TCP_Server_Info *server = cifs_ses_server(ses);
 611	NEGOTIATE_MESSAGE *sec_blob = (NEGOTIATE_MESSAGE *)pbuffer;
 612	__u32 flags;
 
 
 
 
 
 
 
 
 
 
 
 
 613
 614	memset(pbuffer, 0, sizeof(NEGOTIATE_MESSAGE));
 615	memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
 616	sec_blob->MessageType = NtLmNegotiate;
 617
 618	/* BB is NTLMV2 session security format easier to use here? */
 619	flags = NTLMSSP_NEGOTIATE_56 |	NTLMSSP_REQUEST_TARGET |
 620		NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
 621		NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC |
 622		NTLMSSP_NEGOTIATE_SEAL;
 623	if (server->sign)
 624		flags |= NTLMSSP_NEGOTIATE_SIGN;
 625	if (!server->session_estab || ses->ntlmssp->sesskey_per_smbsess)
 626		flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
 627
 
 
 628	sec_blob->NegotiateFlags = cpu_to_le32(flags);
 629
 630	sec_blob->WorkstationName.BufferOffset = 0;
 631	sec_blob->WorkstationName.Length = 0;
 632	sec_blob->WorkstationName.MaximumLength = 0;
 
 
 
 
 
 
 
 
 
 633
 634	/* Domain name is sent on the Challenge not Negotiate NTLMSSP request */
 635	sec_blob->DomainName.BufferOffset = 0;
 636	sec_blob->DomainName.Length = 0;
 637	sec_blob->DomainName.MaximumLength = 0;
 638}
 639
 640static int size_of_ntlmssp_blob(struct cifs_ses *ses)
 
 
 
 
 
 
 
 
 
 641{
 642	int sz = sizeof(AUTHENTICATE_MESSAGE) + ses->auth_key.len
 643		- CIFS_SESS_KEY_SIZE + CIFS_CPHTXT_SIZE + 2;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 644
 645	if (ses->domainName)
 646		sz += 2 * strnlen(ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
 647	else
 648		sz += 2;
 649
 650	if (ses->user_name)
 651		sz += 2 * strnlen(ses->user_name, CIFS_MAX_USERNAME_LEN);
 652	else
 653		sz += 2;
 
 
 
 
 
 
 
 
 654
 655	return sz;
 
 
 656}
 657
 
 658int build_ntlmssp_auth_blob(unsigned char **pbuffer,
 659					u16 *buflen,
 660				   struct cifs_ses *ses,
 
 661				   const struct nls_table *nls_cp)
 662{
 663	int rc;
 664	AUTHENTICATE_MESSAGE *sec_blob;
 665	__u32 flags;
 666	unsigned char *tmp;
 
 667
 668	rc = setup_ntlmv2_rsp(ses, nls_cp);
 669	if (rc) {
 670		cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
 671		*buflen = 0;
 672		goto setup_ntlmv2_ret;
 673	}
 674	*pbuffer = kmalloc(size_of_ntlmssp_blob(ses), GFP_KERNEL);
 
 
 675	if (!*pbuffer) {
 676		rc = -ENOMEM;
 677		cifs_dbg(VFS, "Error %d during NTLMSSP allocation\n", rc);
 678		*buflen = 0;
 679		goto setup_ntlmv2_ret;
 680	}
 681	sec_blob = (AUTHENTICATE_MESSAGE *)*pbuffer;
 682
 683	memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
 684	sec_blob->MessageType = NtLmAuthenticate;
 685
 686	flags = NTLMSSP_NEGOTIATE_56 |
 687		NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_TARGET_INFO |
 688		NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
 689		NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC |
 690		NTLMSSP_NEGOTIATE_SEAL;
 691	if (ses->server->sign)
 692		flags |= NTLMSSP_NEGOTIATE_SIGN;
 693	if (!ses->server->session_estab || ses->ntlmssp->sesskey_per_smbsess)
 694		flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
 695
 696	tmp = *pbuffer + sizeof(AUTHENTICATE_MESSAGE);
 697	sec_blob->NegotiateFlags = cpu_to_le32(flags);
 698
 699	sec_blob->LmChallengeResponse.BufferOffset =
 700				cpu_to_le32(sizeof(AUTHENTICATE_MESSAGE));
 701	sec_blob->LmChallengeResponse.Length = 0;
 702	sec_blob->LmChallengeResponse.MaximumLength = 0;
 703
 704	sec_blob->NtChallengeResponse.BufferOffset =
 705				cpu_to_le32(tmp - *pbuffer);
 706	if (ses->user_name != NULL) {
 707		memcpy(tmp, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
 708				ses->auth_key.len - CIFS_SESS_KEY_SIZE);
 709		tmp += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
 710
 711		sec_blob->NtChallengeResponse.Length =
 712				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
 713		sec_blob->NtChallengeResponse.MaximumLength =
 714				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
 715	} else {
 716		/*
 717		 * don't send an NT Response for anonymous access
 718		 */
 719		sec_blob->NtChallengeResponse.Length = 0;
 720		sec_blob->NtChallengeResponse.MaximumLength = 0;
 721	}
 722
 723	if (ses->domainName == NULL) {
 724		sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 725		sec_blob->DomainName.Length = 0;
 726		sec_blob->DomainName.MaximumLength = 0;
 727		tmp += 2;
 728	} else {
 729		int len;
 730		len = cifs_strtoUTF16((__le16 *)tmp, ses->domainName,
 731				      CIFS_MAX_DOMAINNAME_LEN, nls_cp);
 732		len *= 2; /* unicode is 2 bytes each */
 733		sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 734		sec_blob->DomainName.Length = cpu_to_le16(len);
 735		sec_blob->DomainName.MaximumLength = cpu_to_le16(len);
 736		tmp += len;
 737	}
 738
 739	if (ses->user_name == NULL) {
 740		sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 741		sec_blob->UserName.Length = 0;
 742		sec_blob->UserName.MaximumLength = 0;
 743		tmp += 2;
 744	} else {
 745		int len;
 746		len = cifs_strtoUTF16((__le16 *)tmp, ses->user_name,
 747				      CIFS_MAX_USERNAME_LEN, nls_cp);
 748		len *= 2; /* unicode is 2 bytes each */
 749		sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 750		sec_blob->UserName.Length = cpu_to_le16(len);
 751		sec_blob->UserName.MaximumLength = cpu_to_le16(len);
 752		tmp += len;
 753	}
 754
 755	sec_blob->WorkstationName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 756	sec_blob->WorkstationName.Length = 0;
 757	sec_blob->WorkstationName.MaximumLength = 0;
 758	tmp += 2;
 759
 760	if (((ses->ntlmssp->server_flags & NTLMSSP_NEGOTIATE_KEY_XCH) ||
 761		(ses->ntlmssp->server_flags & NTLMSSP_NEGOTIATE_EXTENDED_SEC))
 762			&& !calc_seckey(ses)) {
 763		memcpy(tmp, ses->ntlmssp->ciphertext, CIFS_CPHTXT_SIZE);
 764		sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 765		sec_blob->SessionKey.Length = cpu_to_le16(CIFS_CPHTXT_SIZE);
 766		sec_blob->SessionKey.MaximumLength =
 767				cpu_to_le16(CIFS_CPHTXT_SIZE);
 768		tmp += CIFS_CPHTXT_SIZE;
 769	} else {
 770		sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 771		sec_blob->SessionKey.Length = 0;
 772		sec_blob->SessionKey.MaximumLength = 0;
 773	}
 774
 775	*buflen = tmp - *pbuffer;
 776setup_ntlmv2_ret:
 777	return rc;
 778}
 779
 780enum securityEnum
 781cifs_select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
 782{
 783	switch (server->negflavor) {
 784	case CIFS_NEGFLAVOR_EXTENDED:
 785		switch (requested) {
 786		case Kerberos:
 787		case RawNTLMSSP:
 788			return requested;
 789		case Unspecified:
 790			if (server->sec_ntlmssp &&
 791			    (global_secflags & CIFSSEC_MAY_NTLMSSP))
 792				return RawNTLMSSP;
 793			if ((server->sec_kerberos || server->sec_mskerberos) &&
 794			    (global_secflags & CIFSSEC_MAY_KRB5))
 795				return Kerberos;
 796			fallthrough;
 797		default:
 798			return Unspecified;
 799		}
 800	case CIFS_NEGFLAVOR_UNENCAP:
 801		switch (requested) {
 802		case NTLM:
 803		case NTLMv2:
 804			return requested;
 805		case Unspecified:
 806			if (global_secflags & CIFSSEC_MAY_NTLMV2)
 807				return NTLMv2;
 808			if (global_secflags & CIFSSEC_MAY_NTLM)
 809				return NTLM;
 810			break;
 811		default:
 812			break;
 813		}
 814		fallthrough;	/* to attempt LANMAN authentication next */
 815	case CIFS_NEGFLAVOR_LANMAN:
 816		switch (requested) {
 817		case LANMAN:
 818			return requested;
 819		case Unspecified:
 820			if (global_secflags & CIFSSEC_MAY_LANMAN)
 821				return LANMAN;
 822			fallthrough;
 823		default:
 824			return Unspecified;
 825		}
 826	default:
 827		return Unspecified;
 828	}
 829}
 830
 831struct sess_data {
 832	unsigned int xid;
 833	struct cifs_ses *ses;
 
 834	struct nls_table *nls_cp;
 835	void (*func)(struct sess_data *);
 836	int result;
 837
 838	/* we will send the SMB in three pieces:
 839	 * a fixed length beginning part, an optional
 840	 * SPNEGO blob (which can be zero length), and a
 841	 * last part which will include the strings
 842	 * and rest of bcc area. This allows us to avoid
 843	 * a large buffer 17K allocation
 844	 */
 845	int buf0_type;
 846	struct kvec iov[3];
 847};
 848
 
 849static int
 850sess_alloc_buffer(struct sess_data *sess_data, int wct)
 851{
 852	int rc;
 853	struct cifs_ses *ses = sess_data->ses;
 854	struct smb_hdr *smb_buf;
 855
 856	rc = small_smb_init_no_tc(SMB_COM_SESSION_SETUP_ANDX, wct, ses,
 857				  (void **)&smb_buf);
 858
 859	if (rc)
 860		return rc;
 861
 862	sess_data->iov[0].iov_base = (char *)smb_buf;
 863	sess_data->iov[0].iov_len = be32_to_cpu(smb_buf->smb_buf_length) + 4;
 864	/*
 865	 * This variable will be used to clear the buffer
 866	 * allocated above in case of any error in the calling function.
 867	 */
 868	sess_data->buf0_type = CIFS_SMALL_BUFFER;
 869
 870	/* 2000 big enough to fit max user, domain, NOS name etc. */
 871	sess_data->iov[2].iov_base = kmalloc(2000, GFP_KERNEL);
 872	if (!sess_data->iov[2].iov_base) {
 873		rc = -ENOMEM;
 874		goto out_free_smb_buf;
 875	}
 876
 877	return 0;
 878
 879out_free_smb_buf:
 880	cifs_small_buf_release(smb_buf);
 881	sess_data->iov[0].iov_base = NULL;
 882	sess_data->iov[0].iov_len = 0;
 883	sess_data->buf0_type = CIFS_NO_BUFFER;
 884	return rc;
 885}
 886
 887static void
 888sess_free_buffer(struct sess_data *sess_data)
 889{
 
 890
 891	free_rsp_buf(sess_data->buf0_type, sess_data->iov[0].iov_base);
 
 
 
 
 
 
 
 892	sess_data->buf0_type = CIFS_NO_BUFFER;
 893	kfree(sess_data->iov[2].iov_base);
 894}
 895
 896static int
 897sess_establish_session(struct sess_data *sess_data)
 898{
 899	struct cifs_ses *ses = sess_data->ses;
 
 900
 901	mutex_lock(&ses->server->srv_mutex);
 902	if (!ses->server->session_estab) {
 903		if (ses->server->sign) {
 904			ses->server->session_key.response =
 905				kmemdup(ses->auth_key.response,
 906				ses->auth_key.len, GFP_KERNEL);
 907			if (!ses->server->session_key.response) {
 908				mutex_unlock(&ses->server->srv_mutex);
 909				return -ENOMEM;
 910			}
 911			ses->server->session_key.len =
 912						ses->auth_key.len;
 913		}
 914		ses->server->sequence_number = 0x2;
 915		ses->server->session_estab = true;
 916	}
 917	mutex_unlock(&ses->server->srv_mutex);
 918
 919	cifs_dbg(FYI, "CIFS session established successfully\n");
 920	spin_lock(&GlobalMid_Lock);
 921	ses->status = CifsGood;
 922	ses->need_reconnect = false;
 923	spin_unlock(&GlobalMid_Lock);
 924
 925	return 0;
 926}
 927
 928static int
 929sess_sendreceive(struct sess_data *sess_data)
 930{
 931	int rc;
 932	struct smb_hdr *smb_buf = (struct smb_hdr *) sess_data->iov[0].iov_base;
 933	__u16 count;
 934	struct kvec rsp_iov = { NULL, 0 };
 935
 936	count = sess_data->iov[1].iov_len + sess_data->iov[2].iov_len;
 937	be32_add_cpu(&smb_buf->smb_buf_length, count);
 938	put_bcc(count, smb_buf);
 939
 940	rc = SendReceive2(sess_data->xid, sess_data->ses,
 941			  sess_data->iov, 3 /* num_iovecs */,
 942			  &sess_data->buf0_type,
 943			  CIFS_LOG_ERROR, &rsp_iov);
 944	cifs_small_buf_release(sess_data->iov[0].iov_base);
 945	memcpy(&sess_data->iov[0], &rsp_iov, sizeof(struct kvec));
 946
 947	return rc;
 948}
 949
 950/*
 951 * LANMAN and plaintext are less secure and off by default.
 952 * So we make this explicitly be turned on in kconfig (in the
 953 * build) and turned on at runtime (changed from the default)
 954 * in proc/fs/cifs or via mount parm.  Unfortunately this is
 955 * needed for old Win (e.g. Win95), some obscure NAS and OS/2
 956 */
 957#ifdef CONFIG_CIFS_WEAK_PW_HASH
 958static void
 959sess_auth_lanman(struct sess_data *sess_data)
 960{
 961	int rc = 0;
 962	struct smb_hdr *smb_buf;
 963	SESSION_SETUP_ANDX *pSMB;
 964	char *bcc_ptr;
 965	struct cifs_ses *ses = sess_data->ses;
 966	char lnm_session_key[CIFS_AUTH_RESP_SIZE];
 967	__u16 bytes_remaining;
 968
 969	/* lanman 2 style sessionsetup */
 970	/* wct = 10 */
 971	rc = sess_alloc_buffer(sess_data, 10);
 972	if (rc)
 973		goto out;
 974
 975	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
 976	bcc_ptr = sess_data->iov[2].iov_base;
 977	(void)cifs_ssetup_hdr(ses, pSMB);
 978
 979	pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE;
 980
 981	if (ses->user_name != NULL) {
 982		/* no capabilities flags in old lanman negotiation */
 983		pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
 984
 985		/* Calculate hash with password and copy into bcc_ptr.
 986		 * Encryption Key (stored as in cryptkey) gets used if the
 987		 * security mode bit in Negotiate Protocol response states
 988		 * to use challenge/response method (i.e. Password bit is 1).
 989		 */
 990		rc = calc_lanman_hash(ses->password, ses->server->cryptkey,
 991				      ses->server->sec_mode & SECMODE_PW_ENCRYPT ?
 992				      true : false, lnm_session_key);
 993		if (rc)
 994			goto out;
 995
 996		memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_AUTH_RESP_SIZE);
 997		bcc_ptr += CIFS_AUTH_RESP_SIZE;
 998	} else {
 999		pSMB->old_req.PasswordLength = 0;
1000	}
1001
1002	/*
1003	 * can not sign if LANMAN negotiated so no need
1004	 * to calculate signing key? but what if server
1005	 * changed to do higher than lanman dialect and
1006	 * we reconnected would we ever calc signing_key?
1007	 */
1008
1009	cifs_dbg(FYI, "Negotiating LANMAN setting up strings\n");
1010	/* Unicode not allowed for LANMAN dialects */
1011	ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
1012
1013	sess_data->iov[2].iov_len = (long) bcc_ptr -
1014			(long) sess_data->iov[2].iov_base;
1015
1016	rc = sess_sendreceive(sess_data);
1017	if (rc)
1018		goto out;
1019
1020	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1021	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1022
1023	/* lanman response has a word count of 3 */
1024	if (smb_buf->WordCount != 3) {
1025		rc = -EIO;
1026		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1027		goto out;
1028	}
1029
1030	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1031		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1032
1033	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1034	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1035
1036	bytes_remaining = get_bcc(smb_buf);
1037	bcc_ptr = pByteArea(smb_buf);
1038
1039	/* BB check if Unicode and decode strings */
1040	if (bytes_remaining == 0) {
1041		/* no string area to decode, do nothing */
1042	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1043		/* unicode string area must be word-aligned */
1044		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
1045			++bcc_ptr;
1046			--bytes_remaining;
1047		}
1048		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1049				      sess_data->nls_cp);
1050	} else {
1051		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1052				    sess_data->nls_cp);
1053	}
1054
1055	rc = sess_establish_session(sess_data);
1056out:
1057	sess_data->result = rc;
1058	sess_data->func = NULL;
1059	sess_free_buffer(sess_data);
1060}
1061
1062#endif
1063
1064static void
1065sess_auth_ntlm(struct sess_data *sess_data)
1066{
1067	int rc = 0;
1068	struct smb_hdr *smb_buf;
1069	SESSION_SETUP_ANDX *pSMB;
1070	char *bcc_ptr;
1071	struct cifs_ses *ses = sess_data->ses;
1072	__u32 capabilities;
1073	__u16 bytes_remaining;
1074
1075	/* old style NTLM sessionsetup */
1076	/* wct = 13 */
1077	rc = sess_alloc_buffer(sess_data, 13);
1078	if (rc)
1079		goto out;
1080
1081	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1082	bcc_ptr = sess_data->iov[2].iov_base;
1083	capabilities = cifs_ssetup_hdr(ses, pSMB);
1084
1085	pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
1086	if (ses->user_name != NULL) {
1087		pSMB->req_no_secext.CaseInsensitivePasswordLength =
1088				cpu_to_le16(CIFS_AUTH_RESP_SIZE);
1089		pSMB->req_no_secext.CaseSensitivePasswordLength =
1090				cpu_to_le16(CIFS_AUTH_RESP_SIZE);
1091
1092		/* calculate ntlm response and session key */
1093		rc = setup_ntlm_response(ses, sess_data->nls_cp);
1094		if (rc) {
1095			cifs_dbg(VFS, "Error %d during NTLM authentication\n",
1096					 rc);
1097			goto out;
1098		}
1099
1100		/* copy ntlm response */
1101		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
1102				CIFS_AUTH_RESP_SIZE);
1103		bcc_ptr += CIFS_AUTH_RESP_SIZE;
1104		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
1105				CIFS_AUTH_RESP_SIZE);
1106		bcc_ptr += CIFS_AUTH_RESP_SIZE;
1107	} else {
1108		pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
1109		pSMB->req_no_secext.CaseSensitivePasswordLength = 0;
1110	}
1111
1112	if (ses->capabilities & CAP_UNICODE) {
1113		/* unicode strings must be word aligned */
1114		if (sess_data->iov[0].iov_len % 2) {
1115			*bcc_ptr = 0;
1116			bcc_ptr++;
1117		}
1118		unicode_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
1119	} else {
1120		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
1121	}
1122
1123
1124	sess_data->iov[2].iov_len = (long) bcc_ptr -
1125			(long) sess_data->iov[2].iov_base;
1126
1127	rc = sess_sendreceive(sess_data);
1128	if (rc)
1129		goto out;
1130
1131	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1132	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1133
1134	if (smb_buf->WordCount != 3) {
1135		rc = -EIO;
1136		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1137		goto out;
1138	}
1139
1140	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1141		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1142
1143	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1144	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1145
1146	bytes_remaining = get_bcc(smb_buf);
1147	bcc_ptr = pByteArea(smb_buf);
1148
1149	/* BB check if Unicode and decode strings */
1150	if (bytes_remaining == 0) {
1151		/* no string area to decode, do nothing */
1152	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1153		/* unicode string area must be word-aligned */
1154		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
1155			++bcc_ptr;
1156			--bytes_remaining;
1157		}
1158		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1159				      sess_data->nls_cp);
1160	} else {
1161		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1162				    sess_data->nls_cp);
1163	}
1164
1165	rc = sess_establish_session(sess_data);
1166out:
1167	sess_data->result = rc;
1168	sess_data->func = NULL;
1169	sess_free_buffer(sess_data);
1170	kfree(ses->auth_key.response);
1171	ses->auth_key.response = NULL;
1172}
1173
1174static void
1175sess_auth_ntlmv2(struct sess_data *sess_data)
1176{
1177	int rc = 0;
1178	struct smb_hdr *smb_buf;
1179	SESSION_SETUP_ANDX *pSMB;
1180	char *bcc_ptr;
1181	struct cifs_ses *ses = sess_data->ses;
 
1182	__u32 capabilities;
1183	__u16 bytes_remaining;
1184
1185	/* old style NTLM sessionsetup */
1186	/* wct = 13 */
1187	rc = sess_alloc_buffer(sess_data, 13);
1188	if (rc)
1189		goto out;
1190
1191	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1192	bcc_ptr = sess_data->iov[2].iov_base;
1193	capabilities = cifs_ssetup_hdr(ses, pSMB);
1194
1195	pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
1196
1197	/* LM2 password would be here if we supported it */
1198	pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
1199
1200	if (ses->user_name != NULL) {
1201		/* calculate nlmv2 response and session key */
1202		rc = setup_ntlmv2_rsp(ses, sess_data->nls_cp);
1203		if (rc) {
1204			cifs_dbg(VFS, "Error %d during NTLMv2 authentication\n", rc);
1205			goto out;
1206		}
1207
1208		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
1209				ses->auth_key.len - CIFS_SESS_KEY_SIZE);
1210		bcc_ptr += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
1211
1212		/* set case sensitive password length after tilen may get
1213		 * assigned, tilen is 0 otherwise.
1214		 */
1215		pSMB->req_no_secext.CaseSensitivePasswordLength =
1216			cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
1217	} else {
1218		pSMB->req_no_secext.CaseSensitivePasswordLength = 0;
1219	}
1220
1221	if (ses->capabilities & CAP_UNICODE) {
1222		if (sess_data->iov[0].iov_len % 2) {
1223			*bcc_ptr = 0;
1224			bcc_ptr++;
1225		}
1226		unicode_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
1227	} else {
1228		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
1229	}
1230
1231
1232	sess_data->iov[2].iov_len = (long) bcc_ptr -
1233			(long) sess_data->iov[2].iov_base;
1234
1235	rc = sess_sendreceive(sess_data);
1236	if (rc)
1237		goto out;
1238
1239	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1240	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1241
1242	if (smb_buf->WordCount != 3) {
1243		rc = -EIO;
1244		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1245		goto out;
1246	}
1247
1248	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1249		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1250
1251	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1252	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1253
1254	bytes_remaining = get_bcc(smb_buf);
1255	bcc_ptr = pByteArea(smb_buf);
1256
1257	/* BB check if Unicode and decode strings */
1258	if (bytes_remaining == 0) {
1259		/* no string area to decode, do nothing */
1260	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1261		/* unicode string area must be word-aligned */
1262		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
1263			++bcc_ptr;
1264			--bytes_remaining;
1265		}
1266		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1267				      sess_data->nls_cp);
1268	} else {
1269		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1270				    sess_data->nls_cp);
1271	}
1272
1273	rc = sess_establish_session(sess_data);
1274out:
1275	sess_data->result = rc;
1276	sess_data->func = NULL;
1277	sess_free_buffer(sess_data);
1278	kfree(ses->auth_key.response);
1279	ses->auth_key.response = NULL;
1280}
1281
1282#ifdef CONFIG_CIFS_UPCALL
1283static void
1284sess_auth_kerberos(struct sess_data *sess_data)
1285{
1286	int rc = 0;
1287	struct smb_hdr *smb_buf;
1288	SESSION_SETUP_ANDX *pSMB;
1289	char *bcc_ptr;
1290	struct cifs_ses *ses = sess_data->ses;
 
1291	__u32 capabilities;
1292	__u16 bytes_remaining;
1293	struct key *spnego_key = NULL;
1294	struct cifs_spnego_msg *msg;
1295	u16 blob_len;
1296
1297	/* extended security */
1298	/* wct = 12 */
1299	rc = sess_alloc_buffer(sess_data, 12);
1300	if (rc)
1301		goto out;
1302
1303	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1304	bcc_ptr = sess_data->iov[2].iov_base;
1305	capabilities = cifs_ssetup_hdr(ses, pSMB);
1306
1307	spnego_key = cifs_get_spnego_key(ses);
1308	if (IS_ERR(spnego_key)) {
1309		rc = PTR_ERR(spnego_key);
1310		spnego_key = NULL;
1311		goto out;
1312	}
1313
1314	msg = spnego_key->payload.data[0];
1315	/*
1316	 * check version field to make sure that cifs.upcall is
1317	 * sending us a response in an expected form
1318	 */
1319	if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) {
1320		cifs_dbg(VFS, "incorrect version of cifs.upcall (expected %d but got %d)\n",
1321			 CIFS_SPNEGO_UPCALL_VERSION, msg->version);
1322		rc = -EKEYREJECTED;
1323		goto out_put_spnego_key;
1324	}
1325
 
1326	ses->auth_key.response = kmemdup(msg->data, msg->sesskey_len,
1327					 GFP_KERNEL);
1328	if (!ses->auth_key.response) {
1329		cifs_dbg(VFS, "Kerberos can't allocate (%u bytes) memory\n",
1330			 msg->sesskey_len);
1331		rc = -ENOMEM;
1332		goto out_put_spnego_key;
1333	}
1334	ses->auth_key.len = msg->sesskey_len;
1335
1336	pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
1337	capabilities |= CAP_EXTENDED_SECURITY;
1338	pSMB->req.Capabilities = cpu_to_le32(capabilities);
1339	sess_data->iov[1].iov_base = msg->data + msg->sesskey_len;
1340	sess_data->iov[1].iov_len = msg->secblob_len;
1341	pSMB->req.SecurityBlobLength = cpu_to_le16(sess_data->iov[1].iov_len);
1342
1343	if (ses->capabilities & CAP_UNICODE) {
1344		/* unicode strings must be word aligned */
1345		if ((sess_data->iov[0].iov_len
1346			+ sess_data->iov[1].iov_len) % 2) {
1347			*bcc_ptr = 0;
1348			bcc_ptr++;
1349		}
1350		unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp);
1351		unicode_domain_string(&bcc_ptr, ses, sess_data->nls_cp);
1352	} else {
1353		/* BB: is this right? */
1354		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
1355	}
1356
1357	sess_data->iov[2].iov_len = (long) bcc_ptr -
1358			(long) sess_data->iov[2].iov_base;
1359
1360	rc = sess_sendreceive(sess_data);
1361	if (rc)
1362		goto out_put_spnego_key;
1363
1364	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1365	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1366
1367	if (smb_buf->WordCount != 4) {
1368		rc = -EIO;
1369		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1370		goto out_put_spnego_key;
1371	}
1372
1373	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1374		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1375
1376	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1377	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1378
1379	bytes_remaining = get_bcc(smb_buf);
1380	bcc_ptr = pByteArea(smb_buf);
1381
1382	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1383	if (blob_len > bytes_remaining) {
1384		cifs_dbg(VFS, "bad security blob length %d\n",
1385				blob_len);
1386		rc = -EINVAL;
1387		goto out_put_spnego_key;
1388	}
1389	bcc_ptr += blob_len;
1390	bytes_remaining -= blob_len;
1391
1392	/* BB check if Unicode and decode strings */
1393	if (bytes_remaining == 0) {
1394		/* no string area to decode, do nothing */
1395	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1396		/* unicode string area must be word-aligned */
1397		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
1398			++bcc_ptr;
1399			--bytes_remaining;
1400		}
1401		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1402				      sess_data->nls_cp);
1403	} else {
1404		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1405				    sess_data->nls_cp);
1406	}
1407
1408	rc = sess_establish_session(sess_data);
1409out_put_spnego_key:
1410	key_invalidate(spnego_key);
1411	key_put(spnego_key);
1412out:
1413	sess_data->result = rc;
1414	sess_data->func = NULL;
1415	sess_free_buffer(sess_data);
1416	kfree(ses->auth_key.response);
1417	ses->auth_key.response = NULL;
1418}
1419
1420#endif /* ! CONFIG_CIFS_UPCALL */
1421
1422/*
1423 * The required kvec buffers have to be allocated before calling this
1424 * function.
1425 */
1426static int
1427_sess_auth_rawntlmssp_assemble_req(struct sess_data *sess_data)
1428{
1429	SESSION_SETUP_ANDX *pSMB;
1430	struct cifs_ses *ses = sess_data->ses;
 
1431	__u32 capabilities;
1432	char *bcc_ptr;
1433
1434	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1435
1436	capabilities = cifs_ssetup_hdr(ses, pSMB);
1437	if ((pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) == 0) {
1438		cifs_dbg(VFS, "NTLMSSP requires Unicode support\n");
1439		return -ENOSYS;
1440	}
1441
1442	pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
1443	capabilities |= CAP_EXTENDED_SECURITY;
1444	pSMB->req.Capabilities |= cpu_to_le32(capabilities);
1445
1446	bcc_ptr = sess_data->iov[2].iov_base;
1447	/* unicode strings must be word aligned */
1448	if ((sess_data->iov[0].iov_len + sess_data->iov[1].iov_len) % 2) {
1449		*bcc_ptr = 0;
1450		bcc_ptr++;
1451	}
1452	unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp);
1453
1454	sess_data->iov[2].iov_len = (long) bcc_ptr -
1455					(long) sess_data->iov[2].iov_base;
1456
1457	return 0;
1458}
1459
1460static void
1461sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data);
1462
1463static void
1464sess_auth_rawntlmssp_negotiate(struct sess_data *sess_data)
1465{
1466	int rc;
1467	struct smb_hdr *smb_buf;
1468	SESSION_SETUP_ANDX *pSMB;
1469	struct cifs_ses *ses = sess_data->ses;
 
1470	__u16 bytes_remaining;
1471	char *bcc_ptr;
 
1472	u16 blob_len;
1473
1474	cifs_dbg(FYI, "rawntlmssp session setup negotiate phase\n");
1475
1476	/*
1477	 * if memory allocation is successful, caller of this function
1478	 * frees it.
1479	 */
1480	ses->ntlmssp = kmalloc(sizeof(struct ntlmssp_auth), GFP_KERNEL);
1481	if (!ses->ntlmssp) {
1482		rc = -ENOMEM;
1483		goto out;
1484	}
1485	ses->ntlmssp->sesskey_per_smbsess = false;
1486
1487	/* wct = 12 */
1488	rc = sess_alloc_buffer(sess_data, 12);
1489	if (rc)
1490		goto out;
1491
1492	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1493
1494	/* Build security blob before we assemble the request */
1495	build_ntlmssp_negotiate_blob(pSMB->req.SecurityBlob, ses);
1496	sess_data->iov[1].iov_len = sizeof(NEGOTIATE_MESSAGE);
1497	sess_data->iov[1].iov_base = pSMB->req.SecurityBlob;
1498	pSMB->req.SecurityBlobLength = cpu_to_le16(sizeof(NEGOTIATE_MESSAGE));
 
 
 
 
 
1499
1500	rc = _sess_auth_rawntlmssp_assemble_req(sess_data);
1501	if (rc)
1502		goto out;
1503
1504	rc = sess_sendreceive(sess_data);
1505
1506	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1507	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1508
1509	/* If true, rc here is expected and not an error */
1510	if (sess_data->buf0_type != CIFS_NO_BUFFER &&
1511	    smb_buf->Status.CifsError ==
1512			cpu_to_le32(NT_STATUS_MORE_PROCESSING_REQUIRED))
1513		rc = 0;
1514
1515	if (rc)
1516		goto out;
1517
1518	cifs_dbg(FYI, "rawntlmssp session setup challenge phase\n");
1519
1520	if (smb_buf->WordCount != 4) {
1521		rc = -EIO;
1522		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1523		goto out;
1524	}
1525
1526	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1527	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1528
1529	bytes_remaining = get_bcc(smb_buf);
1530	bcc_ptr = pByteArea(smb_buf);
1531
1532	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1533	if (blob_len > bytes_remaining) {
1534		cifs_dbg(VFS, "bad security blob length %d\n",
1535				blob_len);
1536		rc = -EINVAL;
1537		goto out;
1538	}
1539
1540	rc = decode_ntlmssp_challenge(bcc_ptr, blob_len, ses);
 
 
 
1541out:
1542	sess_free_buffer(sess_data);
1543
1544	if (!rc) {
1545		sess_data->func = sess_auth_rawntlmssp_authenticate;
1546		return;
1547	}
1548
1549	/* Else error. Cleanup */
1550	kfree(ses->auth_key.response);
1551	ses->auth_key.response = NULL;
1552	kfree(ses->ntlmssp);
1553	ses->ntlmssp = NULL;
1554
1555	sess_data->func = NULL;
1556	sess_data->result = rc;
1557}
1558
1559static void
1560sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data)
1561{
1562	int rc;
1563	struct smb_hdr *smb_buf;
1564	SESSION_SETUP_ANDX *pSMB;
1565	struct cifs_ses *ses = sess_data->ses;
 
1566	__u16 bytes_remaining;
1567	char *bcc_ptr;
1568	unsigned char *ntlmsspblob = NULL;
1569	u16 blob_len;
1570
1571	cifs_dbg(FYI, "rawntlmssp session setup authenticate phase\n");
1572
1573	/* wct = 12 */
1574	rc = sess_alloc_buffer(sess_data, 12);
1575	if (rc)
1576		goto out;
1577
1578	/* Build security blob before we assemble the request */
1579	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1580	smb_buf = (struct smb_hdr *)pSMB;
1581	rc = build_ntlmssp_auth_blob(&ntlmsspblob,
1582					&blob_len, ses, sess_data->nls_cp);
 
1583	if (rc)
1584		goto out_free_ntlmsspblob;
1585	sess_data->iov[1].iov_len = blob_len;
1586	sess_data->iov[1].iov_base = ntlmsspblob;
1587	pSMB->req.SecurityBlobLength = cpu_to_le16(blob_len);
1588	/*
1589	 * Make sure that we tell the server that we are using
1590	 * the uid that it just gave us back on the response
1591	 * (challenge)
1592	 */
1593	smb_buf->Uid = ses->Suid;
1594
1595	rc = _sess_auth_rawntlmssp_assemble_req(sess_data);
1596	if (rc)
1597		goto out_free_ntlmsspblob;
1598
1599	rc = sess_sendreceive(sess_data);
1600	if (rc)
1601		goto out_free_ntlmsspblob;
1602
1603	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1604	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1605	if (smb_buf->WordCount != 4) {
1606		rc = -EIO;
1607		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1608		goto out_free_ntlmsspblob;
1609	}
1610
1611	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1612		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1613
1614	if (ses->Suid != smb_buf->Uid) {
1615		ses->Suid = smb_buf->Uid;
1616		cifs_dbg(FYI, "UID changed! new UID = %llu\n", ses->Suid);
1617	}
1618
1619	bytes_remaining = get_bcc(smb_buf);
1620	bcc_ptr = pByteArea(smb_buf);
1621	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1622	if (blob_len > bytes_remaining) {
1623		cifs_dbg(VFS, "bad security blob length %d\n",
1624				blob_len);
1625		rc = -EINVAL;
1626		goto out_free_ntlmsspblob;
1627	}
1628	bcc_ptr += blob_len;
1629	bytes_remaining -= blob_len;
1630
1631
1632	/* BB check if Unicode and decode strings */
1633	if (bytes_remaining == 0) {
1634		/* no string area to decode, do nothing */
1635	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1636		/* unicode string area must be word-aligned */
1637		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
1638			++bcc_ptr;
1639			--bytes_remaining;
1640		}
1641		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1642				      sess_data->nls_cp);
1643	} else {
1644		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1645				    sess_data->nls_cp);
1646	}
1647
1648out_free_ntlmsspblob:
1649	kfree(ntlmsspblob);
1650out:
1651	sess_free_buffer(sess_data);
1652
1653	 if (!rc)
1654		rc = sess_establish_session(sess_data);
1655
1656	/* Cleanup */
1657	kfree(ses->auth_key.response);
1658	ses->auth_key.response = NULL;
1659	kfree(ses->ntlmssp);
1660	ses->ntlmssp = NULL;
1661
1662	sess_data->func = NULL;
1663	sess_data->result = rc;
1664}
1665
1666static int select_sec(struct cifs_ses *ses, struct sess_data *sess_data)
1667{
1668	int type;
 
 
1669
1670	type = cifs_select_sectype(ses->server, ses->sectype);
1671	cifs_dbg(FYI, "sess setup type %d\n", type);
1672	if (type == Unspecified) {
1673		cifs_dbg(VFS, "Unable to select appropriate authentication method!\n");
1674		return -EINVAL;
1675	}
1676
1677	switch (type) {
1678	case LANMAN:
1679		/* LANMAN and plaintext are less secure and off by default.
1680		 * So we make this explicitly be turned on in kconfig (in the
1681		 * build) and turned on at runtime (changed from the default)
1682		 * in proc/fs/cifs or via mount parm.  Unfortunately this is
1683		 * needed for old Win (e.g. Win95), some obscure NAS and OS/2 */
1684#ifdef CONFIG_CIFS_WEAK_PW_HASH
1685		sess_data->func = sess_auth_lanman;
1686		break;
1687#else
1688		return -EOPNOTSUPP;
1689#endif
1690	case NTLM:
1691		sess_data->func = sess_auth_ntlm;
1692		break;
1693	case NTLMv2:
1694		sess_data->func = sess_auth_ntlmv2;
1695		break;
1696	case Kerberos:
1697#ifdef CONFIG_CIFS_UPCALL
1698		sess_data->func = sess_auth_kerberos;
1699		break;
1700#else
1701		cifs_dbg(VFS, "Kerberos negotiated but upcall support disabled!\n");
1702		return -ENOSYS;
1703#endif /* CONFIG_CIFS_UPCALL */
1704	case RawNTLMSSP:
1705		sess_data->func = sess_auth_rawntlmssp_negotiate;
1706		break;
1707	default:
1708		cifs_dbg(VFS, "secType %d not supported!\n", type);
1709		return -ENOSYS;
1710	}
1711
1712	return 0;
1713}
1714
1715int CIFS_SessSetup(const unsigned int xid, struct cifs_ses *ses,
1716		    const struct nls_table *nls_cp)
 
1717{
1718	int rc = 0;
1719	struct sess_data *sess_data;
1720
1721	if (ses == NULL) {
1722		WARN(1, "%s: ses == NULL!", __func__);
1723		return -EINVAL;
1724	}
1725
1726	sess_data = kzalloc(sizeof(struct sess_data), GFP_KERNEL);
1727	if (!sess_data)
1728		return -ENOMEM;
1729
1730	rc = select_sec(ses, sess_data);
1731	if (rc)
1732		goto out;
1733
1734	sess_data->xid = xid;
1735	sess_data->ses = ses;
 
1736	sess_data->buf0_type = CIFS_NO_BUFFER;
1737	sess_data->nls_cp = (struct nls_table *) nls_cp;
1738
 
 
 
 
1739	while (sess_data->func)
1740		sess_data->func(sess_data);
1741
1742	/* Store result before we free sess_data */
1743	rc = sess_data->result;
1744
1745out:
1746	kfree(sess_data);
1747	return rc;
1748}