1/*
2 *   fs/cifs/sess.c
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 *   This library is free software; you can redistribute it and/or modify
10 *   it under the terms of the GNU Lesser General Public License as published
11 *   by the Free Software Foundation; either version 2.1 of the License, or
12 *   (at your option) any later version.
13 *
14 *   This library is distributed in the hope that it will be useful,
15 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
17 *   the GNU Lesser General Public License for more details.
18 *
19 *   You should have received a copy of the GNU Lesser General Public License
20 *   along with this library; if not, write to the Free Software
21 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24#include "cifspdu.h"
25#include "cifsglob.h"
26#include "cifsproto.h"
27#include "cifs_unicode.h"
28#include "cifs_debug.h"
29#include "ntlmssp.h"
30#include "nterr.h"
31#include <linux/utsname.h>
32#include <linux/slab.h>
33#include "cifs_spnego.h"
34
35static __u32 cifs_ssetup_hdr(struct cifs_ses *ses, SESSION_SETUP_ANDX *pSMB)
36{
37	__u32 capabilities = 0;
38
39	/* init fields common to all four types of SessSetup */
40	/* Note that offsets for first seven fields in req struct are same  */
41	/*	in CIFS Specs so does not matter which of 3 forms of struct */
42	/*	that we use in next few lines                               */
43	/* Note that header is initialized to zero in header_assemble */
44	pSMB->req.AndXCommand = 0xFF;
45	pSMB->req.MaxBufferSize = cpu_to_le16(min_t(u32,
46					CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4,
47					USHRT_MAX));
48	pSMB->req.MaxMpxCount = cpu_to_le16(ses->server->maxReq);
49	pSMB->req.VcNumber = cpu_to_le16(1);
50
51	/* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */
52
53	/* BB verify whether signing required on neg or just on auth frame
54	   (and NTLM case) */
55
56	capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS |
57			CAP_LARGE_WRITE_X | CAP_LARGE_READ_X;
58
59	if (ses->server->sign)
60		pSMB->req.hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
61
62	if (ses->capabilities & CAP_UNICODE) {
63		pSMB->req.hdr.Flags2 |= SMBFLG2_UNICODE;
64		capabilities |= CAP_UNICODE;
65	}
66	if (ses->capabilities & CAP_STATUS32) {
67		pSMB->req.hdr.Flags2 |= SMBFLG2_ERR_STATUS;
68		capabilities |= CAP_STATUS32;
69	}
70	if (ses->capabilities & CAP_DFS) {
71		pSMB->req.hdr.Flags2 |= SMBFLG2_DFS;
72		capabilities |= CAP_DFS;
73	}
74	if (ses->capabilities & CAP_UNIX)
75		capabilities |= CAP_UNIX;
76
77	return capabilities;
78}
79
80static void
81unicode_oslm_strings(char **pbcc_area, const struct nls_table *nls_cp)
82{
83	char *bcc_ptr = *pbcc_area;
84	int bytes_ret = 0;
85
86	/* Copy OS version */
87	bytes_ret = cifs_strtoUTF16((__le16 *)bcc_ptr, "Linux version ", 32,
88				    nls_cp);
89	bcc_ptr += 2 * bytes_ret;
90	bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, init_utsname()->release,
91				    32, nls_cp);
92	bcc_ptr += 2 * bytes_ret;
93	bcc_ptr += 2; /* trailing null */
94
95	bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS,
96				    32, nls_cp);
97	bcc_ptr += 2 * bytes_ret;
98	bcc_ptr += 2; /* trailing null */
99
100	*pbcc_area = bcc_ptr;
101}
102
103static void unicode_domain_string(char **pbcc_area, struct cifs_ses *ses,
104				   const struct nls_table *nls_cp)
105{
106	char *bcc_ptr = *pbcc_area;
107	int bytes_ret = 0;
108
109	/* copy domain */
110	if (ses->domainName == NULL) {
111		/* Sending null domain better than using a bogus domain name (as
112		we did briefly in 2.6.18) since server will use its default */
113		*bcc_ptr = 0;
114		*(bcc_ptr+1) = 0;
115		bytes_ret = 0;
116	} else
117		bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->domainName,
118					    CIFS_MAX_DOMAINNAME_LEN, nls_cp);
119	bcc_ptr += 2 * bytes_ret;
120	bcc_ptr += 2;  /* account for null terminator */
121
122	*pbcc_area = bcc_ptr;
123}
124
125
126static void unicode_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
127				   const struct nls_table *nls_cp)
128{
129	char *bcc_ptr = *pbcc_area;
130	int bytes_ret = 0;
131
132	/* BB FIXME add check that strings total less
133	than 335 or will need to send them as arrays */
134
135	/* unicode strings, must be word aligned before the call */
136/*	if ((long) bcc_ptr % 2)	{
137		*bcc_ptr = 0;
138		bcc_ptr++;
139	} */
140	/* copy user */
141	if (ses->user_name == NULL) {
142		/* null user mount */
143		*bcc_ptr = 0;
144		*(bcc_ptr+1) = 0;
145	} else {
146		bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->user_name,
147					    CIFS_MAX_USERNAME_LEN, nls_cp);
148	}
149	bcc_ptr += 2 * bytes_ret;
150	bcc_ptr += 2; /* account for null termination */
151
152	unicode_domain_string(&bcc_ptr, ses, nls_cp);
153	unicode_oslm_strings(&bcc_ptr, nls_cp);
154
155	*pbcc_area = bcc_ptr;
156}
157
158static void ascii_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
159				 const struct nls_table *nls_cp)
160{
161	char *bcc_ptr = *pbcc_area;
162
163	/* copy user */
164	/* BB what about null user mounts - check that we do this BB */
165	/* copy user */
166	if (ses->user_name != NULL) {
167		strncpy(bcc_ptr, ses->user_name, CIFS_MAX_USERNAME_LEN);
168		bcc_ptr += strnlen(ses->user_name, CIFS_MAX_USERNAME_LEN);
169	}
170	/* else null user mount */
171	*bcc_ptr = 0;
172	bcc_ptr++; /* account for null termination */
173
174	/* copy domain */
175	if (ses->domainName != NULL) {
176		strncpy(bcc_ptr, ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
177		bcc_ptr += strnlen(ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
178	} /* else we will send a null domain name
179	     so the server will default to its own domain */
180	*bcc_ptr = 0;
181	bcc_ptr++;
182
183	/* BB check for overflow here */
184
185	strcpy(bcc_ptr, "Linux version ");
186	bcc_ptr += strlen("Linux version ");
187	strcpy(bcc_ptr, init_utsname()->release);
188	bcc_ptr += strlen(init_utsname()->release) + 1;
189
190	strcpy(bcc_ptr, CIFS_NETWORK_OPSYS);
191	bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1;
192
193	*pbcc_area = bcc_ptr;
194}
195
196static void
197decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifs_ses *ses,
198		      const struct nls_table *nls_cp)
199{
200	int len;
201	char *data = *pbcc_area;
202
203	cifs_dbg(FYI, "bleft %d\n", bleft);
204
205	kfree(ses->serverOS);
206	ses->serverOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
207	cifs_dbg(FYI, "serverOS=%s\n", ses->serverOS);
208	len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
209	data += len;
210	bleft -= len;
211	if (bleft <= 0)
212		return;
213
214	kfree(ses->serverNOS);
215	ses->serverNOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
216	cifs_dbg(FYI, "serverNOS=%s\n", ses->serverNOS);
217	len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
218	data += len;
219	bleft -= len;
220	if (bleft <= 0)
221		return;
222
223	kfree(ses->serverDomain);
224	ses->serverDomain = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
225	cifs_dbg(FYI, "serverDomain=%s\n", ses->serverDomain);
226
227	return;
228}
229
230static void decode_ascii_ssetup(char **pbcc_area, __u16 bleft,
231				struct cifs_ses *ses,
232				const struct nls_table *nls_cp)
233{
234	int len;
235	char *bcc_ptr = *pbcc_area;
236
237	cifs_dbg(FYI, "decode sessetup ascii. bleft %d\n", bleft);
238
239	len = strnlen(bcc_ptr, bleft);
240	if (len >= bleft)
241		return;
242
243	kfree(ses->serverOS);
244
245	ses->serverOS = kzalloc(len + 1, GFP_KERNEL);
246	if (ses->serverOS) {
247		strncpy(ses->serverOS, bcc_ptr, len);
248		if (strncmp(ses->serverOS, "OS/2", 4) == 0)
249			cifs_dbg(FYI, "OS/2 server\n");
250	}
251
252	bcc_ptr += len + 1;
253	bleft -= len + 1;
254
255	len = strnlen(bcc_ptr, bleft);
256	if (len >= bleft)
257		return;
258
259	kfree(ses->serverNOS);
260
261	ses->serverNOS = kzalloc(len + 1, GFP_KERNEL);
262	if (ses->serverNOS)
263		strncpy(ses->serverNOS, bcc_ptr, len);
264
265	bcc_ptr += len + 1;
266	bleft -= len + 1;
267
268	len = strnlen(bcc_ptr, bleft);
269	if (len > bleft)
270		return;
271
272	/* No domain field in LANMAN case. Domain is
273	   returned by old servers in the SMB negprot response */
274	/* BB For newer servers which do not support Unicode,
275	   but thus do return domain here we could add parsing
276	   for it later, but it is not very important */
277	cifs_dbg(FYI, "ascii: bytes left %d\n", bleft);
278}
279
280int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len,
281				    struct cifs_ses *ses)
282{
283	unsigned int tioffset; /* challenge message target info area */
284	unsigned int tilen; /* challenge message target info area length  */
285
286	CHALLENGE_MESSAGE *pblob = (CHALLENGE_MESSAGE *)bcc_ptr;
287
288	if (blob_len < sizeof(CHALLENGE_MESSAGE)) {
289		cifs_dbg(VFS, "challenge blob len %d too small\n", blob_len);
290		return -EINVAL;
291	}
292
293	if (memcmp(pblob->Signature, "NTLMSSP", 8)) {
294		cifs_dbg(VFS, "blob signature incorrect %s\n",
295			 pblob->Signature);
296		return -EINVAL;
297	}
298	if (pblob->MessageType != NtLmChallenge) {
299		cifs_dbg(VFS, "Incorrect message type %d\n",
300			 pblob->MessageType);
301		return -EINVAL;
302	}
303
304	memcpy(ses->ntlmssp->cryptkey, pblob->Challenge, CIFS_CRYPTO_KEY_SIZE);
305	/* BB we could decode pblob->NegotiateFlags; some may be useful */
306	/* In particular we can examine sign flags */
307	/* BB spec says that if AvId field of MsvAvTimestamp is populated then
308		we must set the MIC field of the AUTHENTICATE_MESSAGE */
309	ses->ntlmssp->server_flags = le32_to_cpu(pblob->NegotiateFlags);
310	tioffset = le32_to_cpu(pblob->TargetInfoArray.BufferOffset);
311	tilen = le16_to_cpu(pblob->TargetInfoArray.Length);
312	if (tioffset > blob_len || tioffset + tilen > blob_len) {
313		cifs_dbg(VFS, "tioffset + tilen too high %u + %u",
314			tioffset, tilen);
315		return -EINVAL;
316	}
317	if (tilen) {
318		ses->auth_key.response = kmemdup(bcc_ptr + tioffset, tilen,
319						 GFP_KERNEL);
320		if (!ses->auth_key.response) {
321			cifs_dbg(VFS, "Challenge target info alloc failure");
322			return -ENOMEM;
323		}
324		ses->auth_key.len = tilen;
325	}
326
327	return 0;
328}
329
330/* BB Move to ntlmssp.c eventually */
331
332/* We do not malloc the blob, it is passed in pbuffer, because
333   it is fixed size, and small, making this approach cleaner */
334void build_ntlmssp_negotiate_blob(unsigned char *pbuffer,
335					 struct cifs_ses *ses)
336{
337	NEGOTIATE_MESSAGE *sec_blob = (NEGOTIATE_MESSAGE *)pbuffer;
338	__u32 flags;
339
340	memset(pbuffer, 0, sizeof(NEGOTIATE_MESSAGE));
341	memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
342	sec_blob->MessageType = NtLmNegotiate;
343
344	/* BB is NTLMV2 session security format easier to use here? */
345	flags = NTLMSSP_NEGOTIATE_56 |	NTLMSSP_REQUEST_TARGET |
346		NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
347		NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC;
348	if (ses->server->sign) {
349		flags |= NTLMSSP_NEGOTIATE_SIGN;
350		if (!ses->server->session_estab ||
351				ses->ntlmssp->sesskey_per_smbsess)
352			flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
353	}
354
355	sec_blob->NegotiateFlags = cpu_to_le32(flags);
356
357	sec_blob->WorkstationName.BufferOffset = 0;
358	sec_blob->WorkstationName.Length = 0;
359	sec_blob->WorkstationName.MaximumLength = 0;
360
361	/* Domain name is sent on the Challenge not Negotiate NTLMSSP request */
362	sec_blob->DomainName.BufferOffset = 0;
363	sec_blob->DomainName.Length = 0;
364	sec_blob->DomainName.MaximumLength = 0;
365}
366
367/* We do not malloc the blob, it is passed in pbuffer, because its
368   maximum possible size is fixed and small, making this approach cleaner.
369   This function returns the length of the data in the blob */
370int build_ntlmssp_auth_blob(unsigned char *pbuffer,
371					u16 *buflen,
372				   struct cifs_ses *ses,
373				   const struct nls_table *nls_cp)
374{
375	int rc;
376	AUTHENTICATE_MESSAGE *sec_blob = (AUTHENTICATE_MESSAGE *)pbuffer;
377	__u32 flags;
378	unsigned char *tmp;
379
380	memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
381	sec_blob->MessageType = NtLmAuthenticate;
382
383	flags = NTLMSSP_NEGOTIATE_56 |
384		NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_TARGET_INFO |
385		NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
386		NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC;
387	if (ses->server->sign) {
388		flags |= NTLMSSP_NEGOTIATE_SIGN;
389		if (!ses->server->session_estab ||
390				ses->ntlmssp->sesskey_per_smbsess)
391			flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
392	}
393
394	tmp = pbuffer + sizeof(AUTHENTICATE_MESSAGE);
395	sec_blob->NegotiateFlags = cpu_to_le32(flags);
396
397	sec_blob->LmChallengeResponse.BufferOffset =
398				cpu_to_le32(sizeof(AUTHENTICATE_MESSAGE));
399	sec_blob->LmChallengeResponse.Length = 0;
400	sec_blob->LmChallengeResponse.MaximumLength = 0;
401
402	sec_blob->NtChallengeResponse.BufferOffset = cpu_to_le32(tmp - pbuffer);
403	if (ses->user_name != NULL) {
404		rc = setup_ntlmv2_rsp(ses, nls_cp);
405		if (rc) {
406			cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
407			goto setup_ntlmv2_ret;
408		}
409		memcpy(tmp, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
410				ses->auth_key.len - CIFS_SESS_KEY_SIZE);
411		tmp += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
412
413		sec_blob->NtChallengeResponse.Length =
414				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
415		sec_blob->NtChallengeResponse.MaximumLength =
416				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
417	} else {
418		/*
419		 * don't send an NT Response for anonymous access
420		 */
421		sec_blob->NtChallengeResponse.Length = 0;
422		sec_blob->NtChallengeResponse.MaximumLength = 0;
423	}
424
425	if (ses->domainName == NULL) {
426		sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
427		sec_blob->DomainName.Length = 0;
428		sec_blob->DomainName.MaximumLength = 0;
429		tmp += 2;
430	} else {
431		int len;
432		len = cifs_strtoUTF16((__le16 *)tmp, ses->domainName,
433				      CIFS_MAX_USERNAME_LEN, nls_cp);
434		len *= 2; /* unicode is 2 bytes each */
435		sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
436		sec_blob->DomainName.Length = cpu_to_le16(len);
437		sec_blob->DomainName.MaximumLength = cpu_to_le16(len);
438		tmp += len;
439	}
440
441	if (ses->user_name == NULL) {
442		sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer);
443		sec_blob->UserName.Length = 0;
444		sec_blob->UserName.MaximumLength = 0;
445		tmp += 2;
446	} else {
447		int len;
448		len = cifs_strtoUTF16((__le16 *)tmp, ses->user_name,
449				      CIFS_MAX_USERNAME_LEN, nls_cp);
450		len *= 2; /* unicode is 2 bytes each */
451		sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer);
452		sec_blob->UserName.Length = cpu_to_le16(len);
453		sec_blob->UserName.MaximumLength = cpu_to_le16(len);
454		tmp += len;
455	}
456
457	sec_blob->WorkstationName.BufferOffset = cpu_to_le32(tmp - pbuffer);
458	sec_blob->WorkstationName.Length = 0;
459	sec_blob->WorkstationName.MaximumLength = 0;
460	tmp += 2;
461
462	if (((ses->ntlmssp->server_flags & NTLMSSP_NEGOTIATE_KEY_XCH) ||
463		(ses->ntlmssp->server_flags & NTLMSSP_NEGOTIATE_EXTENDED_SEC))
464			&& !calc_seckey(ses)) {
465		memcpy(tmp, ses->ntlmssp->ciphertext, CIFS_CPHTXT_SIZE);
466		sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - pbuffer);
467		sec_blob->SessionKey.Length = cpu_to_le16(CIFS_CPHTXT_SIZE);
468		sec_blob->SessionKey.MaximumLength =
469				cpu_to_le16(CIFS_CPHTXT_SIZE);
470		tmp += CIFS_CPHTXT_SIZE;
471	} else {
472		sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - pbuffer);
473		sec_blob->SessionKey.Length = 0;
474		sec_blob->SessionKey.MaximumLength = 0;
475	}
476
477setup_ntlmv2_ret:
478	*buflen = tmp - pbuffer;
479	return rc;
480}
481
482enum securityEnum
483select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
484{
485	switch (server->negflavor) {
486	case CIFS_NEGFLAVOR_EXTENDED:
487		switch (requested) {
488		case Kerberos:
489		case RawNTLMSSP:
490			return requested;
491		case Unspecified:
492			if (server->sec_ntlmssp &&
493			    (global_secflags & CIFSSEC_MAY_NTLMSSP))
494				return RawNTLMSSP;
495			if ((server->sec_kerberos || server->sec_mskerberos) &&
496			    (global_secflags & CIFSSEC_MAY_KRB5))
497				return Kerberos;
498			/* Fallthrough */
499		default:
500			return Unspecified;
501		}
502	case CIFS_NEGFLAVOR_UNENCAP:
503		switch (requested) {
504		case NTLM:
505		case NTLMv2:
506			return requested;
507		case Unspecified:
508			if (global_secflags & CIFSSEC_MAY_NTLMV2)
509				return NTLMv2;
510			if (global_secflags & CIFSSEC_MAY_NTLM)
511				return NTLM;
512		default:
513			/* Fallthrough to attempt LANMAN authentication next */
514			break;
515		}
516	case CIFS_NEGFLAVOR_LANMAN:
517		switch (requested) {
518		case LANMAN:
519			return requested;
520		case Unspecified:
521			if (global_secflags & CIFSSEC_MAY_LANMAN)
522				return LANMAN;
523			/* Fallthrough */
524		default:
525			return Unspecified;
526		}
527	default:
528		return Unspecified;
529	}
530}
531
532struct sess_data {
533	unsigned int xid;
534	struct cifs_ses *ses;
535	struct nls_table *nls_cp;
536	void (*func)(struct sess_data *);
537	int result;
538
539	/* we will send the SMB in three pieces:
540	 * a fixed length beginning part, an optional
541	 * SPNEGO blob (which can be zero length), and a
542	 * last part which will include the strings
543	 * and rest of bcc area. This allows us to avoid
544	 * a large buffer 17K allocation
545	 */
546	int buf0_type;
547	struct kvec iov[3];
548};
549
550static int
551sess_alloc_buffer(struct sess_data *sess_data, int wct)
552{
553	int rc;
554	struct cifs_ses *ses = sess_data->ses;
555	struct smb_hdr *smb_buf;
556
557	rc = small_smb_init_no_tc(SMB_COM_SESSION_SETUP_ANDX, wct, ses,
558				  (void **)&smb_buf);
559
560	if (rc)
561		return rc;
562
563	sess_data->iov[0].iov_base = (char *)smb_buf;
564	sess_data->iov[0].iov_len = be32_to_cpu(smb_buf->smb_buf_length) + 4;
565	/*
566	 * This variable will be used to clear the buffer
567	 * allocated above in case of any error in the calling function.
568	 */
569	sess_data->buf0_type = CIFS_SMALL_BUFFER;
570
571	/* 2000 big enough to fit max user, domain, NOS name etc. */
572	sess_data->iov[2].iov_base = kmalloc(2000, GFP_KERNEL);
573	if (!sess_data->iov[2].iov_base) {
574		rc = -ENOMEM;
575		goto out_free_smb_buf;
576	}
577
578	return 0;
579
580out_free_smb_buf:
581	kfree(smb_buf);
582	sess_data->iov[0].iov_base = NULL;
583	sess_data->iov[0].iov_len = 0;
584	sess_data->buf0_type = CIFS_NO_BUFFER;
585	return rc;
586}
587
588static void
589sess_free_buffer(struct sess_data *sess_data)
590{
591
592	free_rsp_buf(sess_data->buf0_type, sess_data->iov[0].iov_base);
593	sess_data->buf0_type = CIFS_NO_BUFFER;
594	kfree(sess_data->iov[2].iov_base);
595}
596
597static int
598sess_establish_session(struct sess_data *sess_data)
599{
600	struct cifs_ses *ses = sess_data->ses;
601
602	mutex_lock(&ses->server->srv_mutex);
603	if (!ses->server->session_estab) {
604		if (ses->server->sign) {
605			ses->server->session_key.response =
606				kmemdup(ses->auth_key.response,
607				ses->auth_key.len, GFP_KERNEL);
608			if (!ses->server->session_key.response) {
609				mutex_unlock(&ses->server->srv_mutex);
610				return -ENOMEM;
611			}
612			ses->server->session_key.len =
613						ses->auth_key.len;
614		}
615		ses->server->sequence_number = 0x2;
616		ses->server->session_estab = true;
617	}
618	mutex_unlock(&ses->server->srv_mutex);
619
620	cifs_dbg(FYI, "CIFS session established successfully\n");
621	spin_lock(&GlobalMid_Lock);
622	ses->status = CifsGood;
623	ses->need_reconnect = false;
624	spin_unlock(&GlobalMid_Lock);
625
626	return 0;
627}
628
629static int
630sess_sendreceive(struct sess_data *sess_data)
631{
632	int rc;
633	struct smb_hdr *smb_buf = (struct smb_hdr *) sess_data->iov[0].iov_base;
634	__u16 count;
635
636	count = sess_data->iov[1].iov_len + sess_data->iov[2].iov_len;
637	smb_buf->smb_buf_length =
638		cpu_to_be32(be32_to_cpu(smb_buf->smb_buf_length) + count);
639	put_bcc(count, smb_buf);
640
641	rc = SendReceive2(sess_data->xid, sess_data->ses,
642			  sess_data->iov, 3 /* num_iovecs */,
643			  &sess_data->buf0_type,
644			  CIFS_LOG_ERROR);
645
646	return rc;
647}
648
649/*
650 * LANMAN and plaintext are less secure and off by default.
651 * So we make this explicitly be turned on in kconfig (in the
652 * build) and turned on at runtime (changed from the default)
653 * in proc/fs/cifs or via mount parm.  Unfortunately this is
654 * needed for old Win (e.g. Win95), some obscure NAS and OS/2
655 */
656#ifdef CONFIG_CIFS_WEAK_PW_HASH
657static void
658sess_auth_lanman(struct sess_data *sess_data)
659{
660	int rc = 0;
661	struct smb_hdr *smb_buf;
662	SESSION_SETUP_ANDX *pSMB;
663	char *bcc_ptr;
664	struct cifs_ses *ses = sess_data->ses;
665	char lnm_session_key[CIFS_AUTH_RESP_SIZE];
666	__u32 capabilities;
667	__u16 bytes_remaining;
668
669	/* lanman 2 style sessionsetup */
670	/* wct = 10 */
671	rc = sess_alloc_buffer(sess_data, 10);
672	if (rc)
673		goto out;
674
675	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
676	bcc_ptr = sess_data->iov[2].iov_base;
677	capabilities = cifs_ssetup_hdr(ses, pSMB);
678
679	pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE;
680
681	if (ses->user_name != NULL) {
682		/* no capabilities flags in old lanman negotiation */
683		pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
684
685		/* Calculate hash with password and copy into bcc_ptr.
686		 * Encryption Key (stored as in cryptkey) gets used if the
687		 * security mode bit in Negottiate Protocol response states
688		 * to use challenge/response method (i.e. Password bit is 1).
689		 */
690		rc = calc_lanman_hash(ses->password, ses->server->cryptkey,
691				      ses->server->sec_mode & SECMODE_PW_ENCRYPT ?
692				      true : false, lnm_session_key);
693
694		memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_AUTH_RESP_SIZE);
695		bcc_ptr += CIFS_AUTH_RESP_SIZE;
696	} else {
697		pSMB->old_req.PasswordLength = 0;
698	}
699
700	/*
701	 * can not sign if LANMAN negotiated so no need
702	 * to calculate signing key? but what if server
703	 * changed to do higher than lanman dialect and
704	 * we reconnected would we ever calc signing_key?
705	 */
706
707	cifs_dbg(FYI, "Negotiating LANMAN setting up strings\n");
708	/* Unicode not allowed for LANMAN dialects */
709	ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
710
711	sess_data->iov[2].iov_len = (long) bcc_ptr -
712			(long) sess_data->iov[2].iov_base;
713
714	rc = sess_sendreceive(sess_data);
715	if (rc)
716		goto out;
717
718	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
719	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
720
721	/* lanman response has a word count of 3 */
722	if (smb_buf->WordCount != 3) {
723		rc = -EIO;
724		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
725		goto out;
726	}
727
728	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
729		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
730
731	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
732	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
733
734	bytes_remaining = get_bcc(smb_buf);
735	bcc_ptr = pByteArea(smb_buf);
736
737	/* BB check if Unicode and decode strings */
738	if (bytes_remaining == 0) {
739		/* no string area to decode, do nothing */
740	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
741		/* unicode string area must be word-aligned */
742		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
743			++bcc_ptr;
744			--bytes_remaining;
745		}
746		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
747				      sess_data->nls_cp);
748	} else {
749		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
750				    sess_data->nls_cp);
751	}
752
753	rc = sess_establish_session(sess_data);
754out:
755	sess_data->result = rc;
756	sess_data->func = NULL;
757	sess_free_buffer(sess_data);
758}
759
760#endif
761
762static void
763sess_auth_ntlm(struct sess_data *sess_data)
764{
765	int rc = 0;
766	struct smb_hdr *smb_buf;
767	SESSION_SETUP_ANDX *pSMB;
768	char *bcc_ptr;
769	struct cifs_ses *ses = sess_data->ses;
770	__u32 capabilities;
771	__u16 bytes_remaining;
772
773	/* old style NTLM sessionsetup */
774	/* wct = 13 */
775	rc = sess_alloc_buffer(sess_data, 13);
776	if (rc)
777		goto out;
778
779	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
780	bcc_ptr = sess_data->iov[2].iov_base;
781	capabilities = cifs_ssetup_hdr(ses, pSMB);
782
783	pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
784	if (ses->user_name != NULL) {
785		pSMB->req_no_secext.CaseInsensitivePasswordLength =
786				cpu_to_le16(CIFS_AUTH_RESP_SIZE);
787		pSMB->req_no_secext.CaseSensitivePasswordLength =
788				cpu_to_le16(CIFS_AUTH_RESP_SIZE);
789
790		/* calculate ntlm response and session key */
791		rc = setup_ntlm_response(ses, sess_data->nls_cp);
792		if (rc) {
793			cifs_dbg(VFS, "Error %d during NTLM authentication\n",
794					 rc);
795			goto out;
796		}
797
798		/* copy ntlm response */
799		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
800				CIFS_AUTH_RESP_SIZE);
801		bcc_ptr += CIFS_AUTH_RESP_SIZE;
802		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
803				CIFS_AUTH_RESP_SIZE);
804		bcc_ptr += CIFS_AUTH_RESP_SIZE;
805	} else {
806		pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
807		pSMB->req_no_secext.CaseSensitivePasswordLength = 0;
808	}
809
810	if (ses->capabilities & CAP_UNICODE) {
811		/* unicode strings must be word aligned */
812		if (sess_data->iov[0].iov_len % 2) {
813			*bcc_ptr = 0;
814			bcc_ptr++;
815		}
816		unicode_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
817	} else {
818		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
819	}
820
821
822	sess_data->iov[2].iov_len = (long) bcc_ptr -
823			(long) sess_data->iov[2].iov_base;
824
825	rc = sess_sendreceive(sess_data);
826	if (rc)
827		goto out;
828
829	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
830	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
831
832	if (smb_buf->WordCount != 3) {
833		rc = -EIO;
834		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
835		goto out;
836	}
837
838	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
839		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
840
841	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
842	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
843
844	bytes_remaining = get_bcc(smb_buf);
845	bcc_ptr = pByteArea(smb_buf);
846
847	/* BB check if Unicode and decode strings */
848	if (bytes_remaining == 0) {
849		/* no string area to decode, do nothing */
850	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
851		/* unicode string area must be word-aligned */
852		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
853			++bcc_ptr;
854			--bytes_remaining;
855		}
856		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
857				      sess_data->nls_cp);
858	} else {
859		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
860				    sess_data->nls_cp);
861	}
862
863	rc = sess_establish_session(sess_data);
864out:
865	sess_data->result = rc;
866	sess_data->func = NULL;
867	sess_free_buffer(sess_data);
868	kfree(ses->auth_key.response);
869	ses->auth_key.response = NULL;
870}
871
872static void
873sess_auth_ntlmv2(struct sess_data *sess_data)
874{
875	int rc = 0;
876	struct smb_hdr *smb_buf;
877	SESSION_SETUP_ANDX *pSMB;
878	char *bcc_ptr;
879	struct cifs_ses *ses = sess_data->ses;
880	__u32 capabilities;
881	__u16 bytes_remaining;
882
883	/* old style NTLM sessionsetup */
884	/* wct = 13 */
885	rc = sess_alloc_buffer(sess_data, 13);
886	if (rc)
887		goto out;
888
889	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
890	bcc_ptr = sess_data->iov[2].iov_base;
891	capabilities = cifs_ssetup_hdr(ses, pSMB);
892
893	pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
894
895	/* LM2 password would be here if we supported it */
896	pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
897
898	if (ses->user_name != NULL) {
899		/* calculate nlmv2 response and session key */
900		rc = setup_ntlmv2_rsp(ses, sess_data->nls_cp);
901		if (rc) {
902			cifs_dbg(VFS, "Error %d during NTLMv2 authentication\n", rc);
903			goto out;
904		}
905
906		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
907				ses->auth_key.len - CIFS_SESS_KEY_SIZE);
908		bcc_ptr += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
909
910		/* set case sensitive password length after tilen may get
911		 * assigned, tilen is 0 otherwise.
912		 */
913		pSMB->req_no_secext.CaseSensitivePasswordLength =
914			cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
915	} else {
916		pSMB->req_no_secext.CaseSensitivePasswordLength = 0;
917	}
918
919	if (ses->capabilities & CAP_UNICODE) {
920		if (sess_data->iov[0].iov_len % 2) {
921			*bcc_ptr = 0;
922			bcc_ptr++;
923		}
924		unicode_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
925	} else {
926		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
927	}
928
929
930	sess_data->iov[2].iov_len = (long) bcc_ptr -
931			(long) sess_data->iov[2].iov_base;
932
933	rc = sess_sendreceive(sess_data);
934	if (rc)
935		goto out;
936
937	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
938	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
939
940	if (smb_buf->WordCount != 3) {
941		rc = -EIO;
942		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
943		goto out;
944	}
945
946	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
947		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
948
949	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
950	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
951
952	bytes_remaining = get_bcc(smb_buf);
953	bcc_ptr = pByteArea(smb_buf);
954
955	/* BB check if Unicode and decode strings */
956	if (bytes_remaining == 0) {
957		/* no string area to decode, do nothing */
958	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
959		/* unicode string area must be word-aligned */
960		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
961			++bcc_ptr;
962			--bytes_remaining;
963		}
964		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
965				      sess_data->nls_cp);
966	} else {
967		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
968				    sess_data->nls_cp);
969	}
970
971	rc = sess_establish_session(sess_data);
972out:
973	sess_data->result = rc;
974	sess_data->func = NULL;
975	sess_free_buffer(sess_data);
976	kfree(ses->auth_key.response);
977	ses->auth_key.response = NULL;
978}
979
980#ifdef CONFIG_CIFS_UPCALL
981static void
982sess_auth_kerberos(struct sess_data *sess_data)
983{
984	int rc = 0;
985	struct smb_hdr *smb_buf;
986	SESSION_SETUP_ANDX *pSMB;
987	char *bcc_ptr;
988	struct cifs_ses *ses = sess_data->ses;
989	__u32 capabilities;
990	__u16 bytes_remaining;
991	struct key *spnego_key = NULL;
992	struct cifs_spnego_msg *msg;
993	u16 blob_len;
994
995	/* extended security */
996	/* wct = 12 */
997	rc = sess_alloc_buffer(sess_data, 12);
998	if (rc)
999		goto out;
1000
1001	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1002	bcc_ptr = sess_data->iov[2].iov_base;
1003	capabilities = cifs_ssetup_hdr(ses, pSMB);
1004
1005	spnego_key = cifs_get_spnego_key(ses);
1006	if (IS_ERR(spnego_key)) {
1007		rc = PTR_ERR(spnego_key);
1008		spnego_key = NULL;
1009		goto out;
1010	}
1011
1012	msg = spnego_key->payload.data;
1013	/*
1014	 * check version field to make sure that cifs.upcall is
1015	 * sending us a response in an expected form
1016	 */
1017	if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) {
1018		cifs_dbg(VFS,
1019		  "incorrect version of cifs.upcall (expected %d but got %d)",
1020			      CIFS_SPNEGO_UPCALL_VERSION, msg->version);
1021		rc = -EKEYREJECTED;
1022		goto out_put_spnego_key;
1023	}
1024
1025	ses->auth_key.response = kmemdup(msg->data, msg->sesskey_len,
1026					 GFP_KERNEL);
1027	if (!ses->auth_key.response) {
1028		cifs_dbg(VFS, "Kerberos can't allocate (%u bytes) memory",
1029				msg->sesskey_len);
1030		rc = -ENOMEM;
1031		goto out_put_spnego_key;
1032	}
1033	ses->auth_key.len = msg->sesskey_len;
1034
1035	pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
1036	capabilities |= CAP_EXTENDED_SECURITY;
1037	pSMB->req.Capabilities = cpu_to_le32(capabilities);
1038	sess_data->iov[1].iov_base = msg->data + msg->sesskey_len;
1039	sess_data->iov[1].iov_len = msg->secblob_len;
1040	pSMB->req.SecurityBlobLength = cpu_to_le16(sess_data->iov[1].iov_len);
1041
1042	if (ses->capabilities & CAP_UNICODE) {
1043		/* unicode strings must be word aligned */
1044		if ((sess_data->iov[0].iov_len
1045			+ sess_data->iov[1].iov_len) % 2) {
1046			*bcc_ptr = 0;
1047			bcc_ptr++;
1048		}
1049		unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp);
1050		unicode_domain_string(&bcc_ptr, ses, sess_data->nls_cp);
1051	} else {
1052		/* BB: is this right? */
1053		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
1054	}
1055
1056	sess_data->iov[2].iov_len = (long) bcc_ptr -
1057			(long) sess_data->iov[2].iov_base;
1058
1059	rc = sess_sendreceive(sess_data);
1060	if (rc)
1061		goto out_put_spnego_key;
1062
1063	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1064	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1065
1066	if (smb_buf->WordCount != 4) {
1067		rc = -EIO;
1068		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1069		goto out_put_spnego_key;
1070	}
1071
1072	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1073		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1074
1075	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1076	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1077
1078	bytes_remaining = get_bcc(smb_buf);
1079	bcc_ptr = pByteArea(smb_buf);
1080
1081	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1082	if (blob_len > bytes_remaining) {
1083		cifs_dbg(VFS, "bad security blob length %d\n",
1084				blob_len);
1085		rc = -EINVAL;
1086		goto out_put_spnego_key;
1087	}
1088	bcc_ptr += blob_len;
1089	bytes_remaining -= blob_len;
1090
1091	/* BB check if Unicode and decode strings */
1092	if (bytes_remaining == 0) {
1093		/* no string area to decode, do nothing */
1094	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1095		/* unicode string area must be word-aligned */
1096		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
1097			++bcc_ptr;
1098			--bytes_remaining;
1099		}
1100		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1101				      sess_data->nls_cp);
1102	} else {
1103		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1104				    sess_data->nls_cp);
1105	}
1106
1107	rc = sess_establish_session(sess_data);
1108out_put_spnego_key:
1109	key_invalidate(spnego_key);
1110	key_put(spnego_key);
1111out:
1112	sess_data->result = rc;
1113	sess_data->func = NULL;
1114	sess_free_buffer(sess_data);
1115	kfree(ses->auth_key.response);
1116	ses->auth_key.response = NULL;
1117}
1118
1119#endif /* ! CONFIG_CIFS_UPCALL */
1120
1121/*
1122 * The required kvec buffers have to be allocated before calling this
1123 * function.
1124 */
1125static int
1126_sess_auth_rawntlmssp_assemble_req(struct sess_data *sess_data)
1127{
1128	struct smb_hdr *smb_buf;
1129	SESSION_SETUP_ANDX *pSMB;
1130	struct cifs_ses *ses = sess_data->ses;
1131	__u32 capabilities;
1132	char *bcc_ptr;
1133
1134	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1135	smb_buf = (struct smb_hdr *)pSMB;
1136
1137	capabilities = cifs_ssetup_hdr(ses, pSMB);
1138	if ((pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) == 0) {
1139		cifs_dbg(VFS, "NTLMSSP requires Unicode support\n");
1140		return -ENOSYS;
1141	}
1142
1143	pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
1144	capabilities |= CAP_EXTENDED_SECURITY;
1145	pSMB->req.Capabilities |= cpu_to_le32(capabilities);
1146
1147	bcc_ptr = sess_data->iov[2].iov_base;
1148	/* unicode strings must be word aligned */
1149	if ((sess_data->iov[0].iov_len + sess_data->iov[1].iov_len) % 2) {
1150		*bcc_ptr = 0;
1151		bcc_ptr++;
1152	}
1153	unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp);
1154
1155	sess_data->iov[2].iov_len = (long) bcc_ptr -
1156					(long) sess_data->iov[2].iov_base;
1157
1158	return 0;
1159}
1160
1161static void
1162sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data);
1163
1164static void
1165sess_auth_rawntlmssp_negotiate(struct sess_data *sess_data)
1166{
1167	int rc;
1168	struct smb_hdr *smb_buf;
1169	SESSION_SETUP_ANDX *pSMB;
1170	struct cifs_ses *ses = sess_data->ses;
1171	__u16 bytes_remaining;
1172	char *bcc_ptr;
1173	u16 blob_len;
1174
1175	cifs_dbg(FYI, "rawntlmssp session setup negotiate phase\n");
1176
1177	/*
1178	 * if memory allocation is successful, caller of this function
1179	 * frees it.
1180	 */
1181	ses->ntlmssp = kmalloc(sizeof(struct ntlmssp_auth), GFP_KERNEL);
1182	if (!ses->ntlmssp) {
1183		rc = -ENOMEM;
1184		goto out;
1185	}
1186	ses->ntlmssp->sesskey_per_smbsess = false;
1187
1188	/* wct = 12 */
1189	rc = sess_alloc_buffer(sess_data, 12);
1190	if (rc)
1191		goto out;
1192
1193	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1194
1195	/* Build security blob before we assemble the request */
1196	build_ntlmssp_negotiate_blob(pSMB->req.SecurityBlob, ses);
1197	sess_data->iov[1].iov_len = sizeof(NEGOTIATE_MESSAGE);
1198	sess_data->iov[1].iov_base = pSMB->req.SecurityBlob;
1199	pSMB->req.SecurityBlobLength = cpu_to_le16(sizeof(NEGOTIATE_MESSAGE));
1200
1201	rc = _sess_auth_rawntlmssp_assemble_req(sess_data);
1202	if (rc)
1203		goto out;
1204
1205	rc = sess_sendreceive(sess_data);
1206
1207	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1208	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1209
1210	/* If true, rc here is expected and not an error */
1211	if (sess_data->buf0_type != CIFS_NO_BUFFER &&
1212	    smb_buf->Status.CifsError ==
1213			cpu_to_le32(NT_STATUS_MORE_PROCESSING_REQUIRED))
1214		rc = 0;
1215
1216	if (rc)
1217		goto out;
1218
1219	cifs_dbg(FYI, "rawntlmssp session setup challenge phase\n");
1220
1221	if (smb_buf->WordCount != 4) {
1222		rc = -EIO;
1223		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1224		goto out;
1225	}
1226
1227	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1228	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1229
1230	bytes_remaining = get_bcc(smb_buf);
1231	bcc_ptr = pByteArea(smb_buf);
1232
1233	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1234	if (blob_len > bytes_remaining) {
1235		cifs_dbg(VFS, "bad security blob length %d\n",
1236				blob_len);
1237		rc = -EINVAL;
1238		goto out;
1239	}
1240
1241	rc = decode_ntlmssp_challenge(bcc_ptr, blob_len, ses);
1242out:
1243	sess_free_buffer(sess_data);
1244
1245	if (!rc) {
1246		sess_data->func = sess_auth_rawntlmssp_authenticate;
1247		return;
1248	}
1249
1250	/* Else error. Cleanup */
1251	kfree(ses->auth_key.response);
1252	ses->auth_key.response = NULL;
1253	kfree(ses->ntlmssp);
1254	ses->ntlmssp = NULL;
1255
1256	sess_data->func = NULL;
1257	sess_data->result = rc;
1258}
1259
1260static void
1261sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data)
1262{
1263	int rc;
1264	struct smb_hdr *smb_buf;
1265	SESSION_SETUP_ANDX *pSMB;
1266	struct cifs_ses *ses = sess_data->ses;
1267	__u16 bytes_remaining;
1268	char *bcc_ptr;
1269	char *ntlmsspblob = NULL;
1270	u16 blob_len;
1271
1272	cifs_dbg(FYI, "rawntlmssp session setup authenticate phase\n");
1273
1274	/* wct = 12 */
1275	rc = sess_alloc_buffer(sess_data, 12);
1276	if (rc)
1277		goto out;
1278
1279	/* Build security blob before we assemble the request */
1280	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1281	smb_buf = (struct smb_hdr *)pSMB;
1282	/*
1283	 * 5 is an empirical value, large enough to hold
1284	 * authenticate message plus max 10 of av paris,
1285	 * domain, user, workstation names, flags, etc.
1286	 */
1287	ntlmsspblob = kzalloc(5*sizeof(struct _AUTHENTICATE_MESSAGE),
1288				GFP_KERNEL);
1289	if (!ntlmsspblob) {
1290		rc = -ENOMEM;
1291		goto out;
1292	}
1293
1294	rc = build_ntlmssp_auth_blob(ntlmsspblob,
1295					&blob_len, ses, sess_data->nls_cp);
1296	if (rc)
1297		goto out_free_ntlmsspblob;
1298	sess_data->iov[1].iov_len = blob_len;
1299	sess_data->iov[1].iov_base = ntlmsspblob;
1300	pSMB->req.SecurityBlobLength = cpu_to_le16(blob_len);
1301	/*
1302	 * Make sure that we tell the server that we are using
1303	 * the uid that it just gave us back on the response
1304	 * (challenge)
1305	 */
1306	smb_buf->Uid = ses->Suid;
1307
1308	rc = _sess_auth_rawntlmssp_assemble_req(sess_data);
1309	if (rc)
1310		goto out_free_ntlmsspblob;
1311
1312	rc = sess_sendreceive(sess_data);
1313	if (rc)
1314		goto out_free_ntlmsspblob;
1315
1316	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1317	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1318	if (smb_buf->WordCount != 4) {
1319		rc = -EIO;
1320		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1321		goto out_free_ntlmsspblob;
1322	}
1323
1324	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1325		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1326
1327	if (ses->Suid != smb_buf->Uid) {
1328		ses->Suid = smb_buf->Uid;
1329		cifs_dbg(FYI, "UID changed! new UID = %llu\n", ses->Suid);
1330	}
1331
1332	bytes_remaining = get_bcc(smb_buf);
1333	bcc_ptr = pByteArea(smb_buf);
1334	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1335	if (blob_len > bytes_remaining) {
1336		cifs_dbg(VFS, "bad security blob length %d\n",
1337				blob_len);
1338		rc = -EINVAL;
1339		goto out_free_ntlmsspblob;
1340	}
1341	bcc_ptr += blob_len;
1342	bytes_remaining -= blob_len;
1343
1344
1345	/* BB check if Unicode and decode strings */
1346	if (bytes_remaining == 0) {
1347		/* no string area to decode, do nothing */
1348	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1349		/* unicode string area must be word-aligned */
1350		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
1351			++bcc_ptr;
1352			--bytes_remaining;
1353		}
1354		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1355				      sess_data->nls_cp);
1356	} else {
1357		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1358				    sess_data->nls_cp);
1359	}
1360
1361out_free_ntlmsspblob:
1362	kfree(ntlmsspblob);
1363out:
1364	sess_free_buffer(sess_data);
1365
1366	 if (!rc)
1367		rc = sess_establish_session(sess_data);
1368
1369	/* Cleanup */
1370	kfree(ses->auth_key.response);
1371	ses->auth_key.response = NULL;
1372	kfree(ses->ntlmssp);
1373	ses->ntlmssp = NULL;
1374
1375	sess_data->func = NULL;
1376	sess_data->result = rc;
1377}
1378
1379static int select_sec(struct cifs_ses *ses, struct sess_data *sess_data)
1380{
1381	int type;
1382
1383	type = select_sectype(ses->server, ses->sectype);
1384	cifs_dbg(FYI, "sess setup type %d\n", type);
1385	if (type == Unspecified) {
1386		cifs_dbg(VFS,
1387			"Unable to select appropriate authentication method!");
1388		return -EINVAL;
1389	}
1390
1391	switch (type) {
1392	case LANMAN:
1393		/* LANMAN and plaintext are less secure and off by default.
1394		 * So we make this explicitly be turned on in kconfig (in the
1395		 * build) and turned on at runtime (changed from the default)
1396		 * in proc/fs/cifs or via mount parm.  Unfortunately this is
1397		 * needed for old Win (e.g. Win95), some obscure NAS and OS/2 */
1398#ifdef CONFIG_CIFS_WEAK_PW_HASH
1399		sess_data->func = sess_auth_lanman;
1400		break;
1401#else
1402		return -EOPNOTSUPP;
1403#endif
1404	case NTLM:
1405		sess_data->func = sess_auth_ntlm;
1406		break;
1407	case NTLMv2:
1408		sess_data->func = sess_auth_ntlmv2;
1409		break;
1410	case Kerberos:
1411#ifdef CONFIG_CIFS_UPCALL
1412		sess_data->func = sess_auth_kerberos;
1413		break;
1414#else
1415		cifs_dbg(VFS, "Kerberos negotiated but upcall support disabled!\n");
1416		return -ENOSYS;
1417		break;
1418#endif /* CONFIG_CIFS_UPCALL */
1419	case RawNTLMSSP:
1420		sess_data->func = sess_auth_rawntlmssp_negotiate;
1421		break;
1422	default:
1423		cifs_dbg(VFS, "secType %d not supported!\n", type);
1424		return -ENOSYS;
1425	}
1426
1427	return 0;
1428}
1429
1430int CIFS_SessSetup(const unsigned int xid, struct cifs_ses *ses,
1431		    const struct nls_table *nls_cp)
1432{
1433	int rc = 0;
1434	struct sess_data *sess_data;
1435
1436	if (ses == NULL) {
1437		WARN(1, "%s: ses == NULL!", __func__);
1438		return -EINVAL;
1439	}
1440
1441	sess_data = kzalloc(sizeof(struct sess_data), GFP_KERNEL);
1442	if (!sess_data)
1443		return -ENOMEM;
1444
1445	rc = select_sec(ses, sess_data);
1446	if (rc)
1447		goto out;
1448
1449	sess_data->xid = xid;
1450	sess_data->ses = ses;
1451	sess_data->buf0_type = CIFS_NO_BUFFER;
1452	sess_data->nls_cp = (struct nls_table *) nls_cp;
1453
1454	while (sess_data->func)
1455		sess_data->func(sess_data);
1456
1457	/* Store result before we free sess_data */
1458	rc = sess_data->result;
1459
1460out:
1461	kfree(sess_data);
1462	return rc;
1463}
1464