Linux Audio

Check our new training course

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