Linux Audio

Check our new training course

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