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}
v4.17
   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		NTLMSSP_NEGOTIATE_SEAL;
 349	if (ses->server->sign)
 350		flags |= NTLMSSP_NEGOTIATE_SIGN;
 351	if (!ses->server->session_estab || ses->ntlmssp->sesskey_per_smbsess)
 352		flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
 
 353
 354	sec_blob->NegotiateFlags = cpu_to_le32(flags);
 355
 356	sec_blob->WorkstationName.BufferOffset = 0;
 357	sec_blob->WorkstationName.Length = 0;
 358	sec_blob->WorkstationName.MaximumLength = 0;
 359
 360	/* Domain name is sent on the Challenge not Negotiate NTLMSSP request */
 361	sec_blob->DomainName.BufferOffset = 0;
 362	sec_blob->DomainName.Length = 0;
 363	sec_blob->DomainName.MaximumLength = 0;
 364}
 365
 366static int size_of_ntlmssp_blob(struct cifs_ses *ses)
 367{
 368	int sz = sizeof(AUTHENTICATE_MESSAGE) + ses->auth_key.len
 369		- CIFS_SESS_KEY_SIZE + CIFS_CPHTXT_SIZE + 2;
 370
 371	if (ses->domainName)
 372		sz += 2 * strnlen(ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
 373	else
 374		sz += 2;
 375
 376	if (ses->user_name)
 377		sz += 2 * strnlen(ses->user_name, CIFS_MAX_USERNAME_LEN);
 378	else
 379		sz += 2;
 380
 381	return sz;
 382}
 383
 384int build_ntlmssp_auth_blob(unsigned char **pbuffer,
 385					u16 *buflen,
 386				   struct cifs_ses *ses,
 387				   const struct nls_table *nls_cp)
 388{
 389	int rc;
 390	AUTHENTICATE_MESSAGE *sec_blob;
 391	__u32 flags;
 392	unsigned char *tmp;
 393
 394	rc = setup_ntlmv2_rsp(ses, nls_cp);
 395	if (rc) {
 396		cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
 397		*buflen = 0;
 398		goto setup_ntlmv2_ret;
 399	}
 400	*pbuffer = kmalloc(size_of_ntlmssp_blob(ses), GFP_KERNEL);
 401	sec_blob = (AUTHENTICATE_MESSAGE *)*pbuffer;
 402
 403	memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
 404	sec_blob->MessageType = NtLmAuthenticate;
 405
 406	flags = NTLMSSP_NEGOTIATE_56 |
 407		NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_TARGET_INFO |
 408		NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
 409		NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC |
 410		NTLMSSP_NEGOTIATE_SEAL;
 411	if (ses->server->sign)
 412		flags |= NTLMSSP_NEGOTIATE_SIGN;
 413	if (!ses->server->session_estab || ses->ntlmssp->sesskey_per_smbsess)
 414		flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
 
 415
 416	tmp = *pbuffer + sizeof(AUTHENTICATE_MESSAGE);
 417	sec_blob->NegotiateFlags = cpu_to_le32(flags);
 418
 419	sec_blob->LmChallengeResponse.BufferOffset =
 420				cpu_to_le32(sizeof(AUTHENTICATE_MESSAGE));
 421	sec_blob->LmChallengeResponse.Length = 0;
 422	sec_blob->LmChallengeResponse.MaximumLength = 0;
 423
 424	sec_blob->NtChallengeResponse.BufferOffset =
 425				cpu_to_le32(tmp - *pbuffer);
 426	if (ses->user_name != NULL) {
 427		memcpy(tmp, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
 428				ses->auth_key.len - CIFS_SESS_KEY_SIZE);
 429		tmp += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
 
 
 
 430
 431		sec_blob->NtChallengeResponse.Length =
 432				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
 433		sec_blob->NtChallengeResponse.MaximumLength =
 434				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
 435	} else {
 436		/*
 437		 * don't send an NT Response for anonymous access
 438		 */
 439		sec_blob->NtChallengeResponse.Length = 0;
 440		sec_blob->NtChallengeResponse.MaximumLength = 0;
 441	}
 442
 443	if (ses->domainName == NULL) {
 444		sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 445		sec_blob->DomainName.Length = 0;
 446		sec_blob->DomainName.MaximumLength = 0;
 447		tmp += 2;
 448	} else {
 449		int len;
 450		len = cifs_strtoUTF16((__le16 *)tmp, ses->domainName,
 451				      CIFS_MAX_DOMAINNAME_LEN, nls_cp);
 452		len *= 2; /* unicode is 2 bytes each */
 453		sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 454		sec_blob->DomainName.Length = cpu_to_le16(len);
 455		sec_blob->DomainName.MaximumLength = cpu_to_le16(len);
 456		tmp += len;
 457	}
 458
 459	if (ses->user_name == NULL) {
 460		sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 461		sec_blob->UserName.Length = 0;
 462		sec_blob->UserName.MaximumLength = 0;
 463		tmp += 2;
 464	} else {
 465		int len;
 466		len = cifs_strtoUTF16((__le16 *)tmp, ses->user_name,
 467				      CIFS_MAX_USERNAME_LEN, nls_cp);
 468		len *= 2; /* unicode is 2 bytes each */
 469		sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 470		sec_blob->UserName.Length = cpu_to_le16(len);
 471		sec_blob->UserName.MaximumLength = cpu_to_le16(len);
 472		tmp += len;
 473	}
 474
 475	sec_blob->WorkstationName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 476	sec_blob->WorkstationName.Length = 0;
 477	sec_blob->WorkstationName.MaximumLength = 0;
 478	tmp += 2;
 479
 480	if (((ses->ntlmssp->server_flags & NTLMSSP_NEGOTIATE_KEY_XCH) ||
 481		(ses->ntlmssp->server_flags & NTLMSSP_NEGOTIATE_EXTENDED_SEC))
 482			&& !calc_seckey(ses)) {
 483		memcpy(tmp, ses->ntlmssp->ciphertext, CIFS_CPHTXT_SIZE);
 484		sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 485		sec_blob->SessionKey.Length = cpu_to_le16(CIFS_CPHTXT_SIZE);
 486		sec_blob->SessionKey.MaximumLength =
 487				cpu_to_le16(CIFS_CPHTXT_SIZE);
 488		tmp += CIFS_CPHTXT_SIZE;
 489	} else {
 490		sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - *pbuffer);
 491		sec_blob->SessionKey.Length = 0;
 492		sec_blob->SessionKey.MaximumLength = 0;
 493	}
 494
 495	*buflen = tmp - *pbuffer;
 496setup_ntlmv2_ret:
 
 497	return rc;
 498}
 499
 500enum securityEnum
 501cifs_select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
 
 502{
 503	switch (server->negflavor) {
 504	case CIFS_NEGFLAVOR_EXTENDED:
 505		switch (requested) {
 506		case Kerberos:
 507		case RawNTLMSSP:
 508			return requested;
 509		case Unspecified:
 510			if (server->sec_ntlmssp &&
 511			    (global_secflags & CIFSSEC_MAY_NTLMSSP))
 512				return RawNTLMSSP;
 513			if ((server->sec_kerberos || server->sec_mskerberos) &&
 514			    (global_secflags & CIFSSEC_MAY_KRB5))
 515				return Kerberos;
 516			/* Fallthrough */
 517		default:
 518			return Unspecified;
 519		}
 520	case CIFS_NEGFLAVOR_UNENCAP:
 521		switch (requested) {
 522		case NTLM:
 523		case NTLMv2:
 524			return requested;
 525		case Unspecified:
 526			if (global_secflags & CIFSSEC_MAY_NTLMV2)
 527				return NTLMv2;
 528			if (global_secflags & CIFSSEC_MAY_NTLM)
 529				return NTLM;
 530		default:
 531			/* Fallthrough to attempt LANMAN authentication next */
 532			break;
 533		}
 534	case CIFS_NEGFLAVOR_LANMAN:
 535		switch (requested) {
 536		case LANMAN:
 537			return requested;
 538		case Unspecified:
 539			if (global_secflags & CIFSSEC_MAY_LANMAN)
 540				return LANMAN;
 541			/* Fallthrough */
 542		default:
 543			return Unspecified;
 544		}
 545	default:
 546		return Unspecified;
 547	}
 548}
 549
 550struct sess_data {
 551	unsigned int xid;
 552	struct cifs_ses *ses;
 553	struct nls_table *nls_cp;
 554	void (*func)(struct sess_data *);
 555	int result;
 556
 557	/* we will send the SMB in three pieces:
 558	 * a fixed length beginning part, an optional
 559	 * SPNEGO blob (which can be zero length), and a
 560	 * last part which will include the strings
 561	 * and rest of bcc area. This allows us to avoid
 562	 * a large buffer 17K allocation
 563	 */
 564	int buf0_type;
 565	struct kvec iov[3];
 566};
 567
 568static int
 569sess_alloc_buffer(struct sess_data *sess_data, int wct)
 570{
 571	int rc;
 572	struct cifs_ses *ses = sess_data->ses;
 573	struct smb_hdr *smb_buf;
 574
 575	rc = small_smb_init_no_tc(SMB_COM_SESSION_SETUP_ANDX, wct, ses,
 576				  (void **)&smb_buf);
 577
 578	if (rc)
 579		return rc;
 580
 581	sess_data->iov[0].iov_base = (char *)smb_buf;
 582	sess_data->iov[0].iov_len = be32_to_cpu(smb_buf->smb_buf_length) + 4;
 583	/*
 584	 * This variable will be used to clear the buffer
 585	 * allocated above in case of any error in the calling function.
 586	 */
 587	sess_data->buf0_type = CIFS_SMALL_BUFFER;
 
 
 
 
 
 
 
 
 
 588
 589	/* 2000 big enough to fit max user, domain, NOS name etc. */
 590	sess_data->iov[2].iov_base = kmalloc(2000, GFP_KERNEL);
 591	if (!sess_data->iov[2].iov_base) {
 592		rc = -ENOMEM;
 593		goto out_free_smb_buf;
 594	}
 
 595
 596	return 0;
 597
 598out_free_smb_buf:
 599	kfree(smb_buf);
 600	sess_data->iov[0].iov_base = NULL;
 601	sess_data->iov[0].iov_len = 0;
 602	sess_data->buf0_type = CIFS_NO_BUFFER;
 603	return rc;
 604}
 605
 606static void
 607sess_free_buffer(struct sess_data *sess_data)
 608{
 609
 610	free_rsp_buf(sess_data->buf0_type, sess_data->iov[0].iov_base);
 611	sess_data->buf0_type = CIFS_NO_BUFFER;
 612	kfree(sess_data->iov[2].iov_base);
 613}
 614
 615static int
 616sess_establish_session(struct sess_data *sess_data)
 617{
 618	struct cifs_ses *ses = sess_data->ses;
 619
 620	mutex_lock(&ses->server->srv_mutex);
 621	if (!ses->server->session_estab) {
 622		if (ses->server->sign) {
 623			ses->server->session_key.response =
 624				kmemdup(ses->auth_key.response,
 625				ses->auth_key.len, GFP_KERNEL);
 626			if (!ses->server->session_key.response) {
 627				mutex_unlock(&ses->server->srv_mutex);
 628				return -ENOMEM;
 629			}
 630			ses->server->session_key.len =
 631						ses->auth_key.len;
 632		}
 633		ses->server->sequence_number = 0x2;
 634		ses->server->session_estab = true;
 635	}
 636	mutex_unlock(&ses->server->srv_mutex);
 637
 638	cifs_dbg(FYI, "CIFS session established successfully\n");
 639	spin_lock(&GlobalMid_Lock);
 640	ses->status = CifsGood;
 641	ses->need_reconnect = false;
 642	spin_unlock(&GlobalMid_Lock);
 643
 644	return 0;
 645}
 646
 647static int
 648sess_sendreceive(struct sess_data *sess_data)
 649{
 650	int rc;
 651	struct smb_hdr *smb_buf = (struct smb_hdr *) sess_data->iov[0].iov_base;
 652	__u16 count;
 653	struct kvec rsp_iov = { NULL, 0 };
 654
 655	count = sess_data->iov[1].iov_len + sess_data->iov[2].iov_len;
 656	smb_buf->smb_buf_length =
 657		cpu_to_be32(be32_to_cpu(smb_buf->smb_buf_length) + count);
 658	put_bcc(count, smb_buf);
 659
 660	rc = SendReceive2(sess_data->xid, sess_data->ses,
 661			  sess_data->iov, 3 /* num_iovecs */,
 662			  &sess_data->buf0_type,
 663			  CIFS_LOG_ERROR, &rsp_iov);
 664	cifs_small_buf_release(sess_data->iov[0].iov_base);
 665	memcpy(&sess_data->iov[0], &rsp_iov, sizeof(struct kvec));
 666
 667	return rc;
 668}
 669
 670/*
 671 * LANMAN and plaintext are less secure and off by default.
 672 * So we make this explicitly be turned on in kconfig (in the
 673 * build) and turned on at runtime (changed from the default)
 674 * in proc/fs/cifs or via mount parm.  Unfortunately this is
 675 * needed for old Win (e.g. Win95), some obscure NAS and OS/2
 676 */
 677#ifdef CONFIG_CIFS_WEAK_PW_HASH
 678static void
 679sess_auth_lanman(struct sess_data *sess_data)
 680{
 681	int rc = 0;
 682	struct smb_hdr *smb_buf;
 683	SESSION_SETUP_ANDX *pSMB;
 684	char *bcc_ptr;
 685	struct cifs_ses *ses = sess_data->ses;
 686	char lnm_session_key[CIFS_AUTH_RESP_SIZE];
 687	__u32 capabilities;
 688	__u16 bytes_remaining;
 689
 690	/* lanman 2 style sessionsetup */
 691	/* wct = 10 */
 692	rc = sess_alloc_buffer(sess_data, 10);
 693	if (rc)
 694		goto out;
 695
 696	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
 697	bcc_ptr = sess_data->iov[2].iov_base;
 698	capabilities = cifs_ssetup_hdr(ses, pSMB);
 699
 700	pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE;
 701
 702	if (ses->user_name != NULL) {
 703		/* no capabilities flags in old lanman negotiation */
 704		pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
 705
 706		/* Calculate hash with password and copy into bcc_ptr.
 707		 * Encryption Key (stored as in cryptkey) gets used if the
 708		 * security mode bit in Negottiate Protocol response states
 709		 * to use challenge/response method (i.e. Password bit is 1).
 710		 */
 
 711		rc = calc_lanman_hash(ses->password, ses->server->cryptkey,
 712				      ses->server->sec_mode & SECMODE_PW_ENCRYPT ?
 713				      true : false, lnm_session_key);
 714		if (rc)
 715			goto out;
 716
 
 717		memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_AUTH_RESP_SIZE);
 718		bcc_ptr += CIFS_AUTH_RESP_SIZE;
 719	} else {
 720		pSMB->old_req.PasswordLength = 0;
 721	}
 722
 723	/*
 724	 * can not sign if LANMAN negotiated so no need
 725	 * to calculate signing key? but what if server
 726	 * changed to do higher than lanman dialect and
 727	 * we reconnected would we ever calc signing_key?
 728	 */
 729
 730	cifs_dbg(FYI, "Negotiating LANMAN setting up strings\n");
 731	/* Unicode not allowed for LANMAN dialects */
 732	ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
 733
 734	sess_data->iov[2].iov_len = (long) bcc_ptr -
 735			(long) sess_data->iov[2].iov_base;
 736
 737	rc = sess_sendreceive(sess_data);
 738	if (rc)
 739		goto out;
 740
 741	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
 742	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
 743
 744	/* lanman response has a word count of 3 */
 745	if (smb_buf->WordCount != 3) {
 746		rc = -EIO;
 747		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
 748		goto out;
 749	}
 750
 751	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
 752		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
 753
 754	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
 755	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
 756
 757	bytes_remaining = get_bcc(smb_buf);
 758	bcc_ptr = pByteArea(smb_buf);
 759
 760	/* BB check if Unicode and decode strings */
 761	if (bytes_remaining == 0) {
 762		/* no string area to decode, do nothing */
 763	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
 764		/* unicode string area must be word-aligned */
 765		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
 766			++bcc_ptr;
 767			--bytes_remaining;
 768		}
 769		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
 770				      sess_data->nls_cp);
 771	} else {
 772		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
 773				    sess_data->nls_cp);
 774	}
 775
 776	rc = sess_establish_session(sess_data);
 777out:
 778	sess_data->result = rc;
 779	sess_data->func = NULL;
 780	sess_free_buffer(sess_data);
 781}
 782
 
 
 
 
 
 
 
 
 783#endif
 784
 785static void
 786sess_auth_ntlm(struct sess_data *sess_data)
 787{
 788	int rc = 0;
 789	struct smb_hdr *smb_buf;
 790	SESSION_SETUP_ANDX *pSMB;
 791	char *bcc_ptr;
 792	struct cifs_ses *ses = sess_data->ses;
 793	__u32 capabilities;
 794	__u16 bytes_remaining;
 795
 796	/* old style NTLM sessionsetup */
 797	/* wct = 13 */
 798	rc = sess_alloc_buffer(sess_data, 13);
 799	if (rc)
 800		goto out;
 801
 802	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
 803	bcc_ptr = sess_data->iov[2].iov_base;
 804	capabilities = cifs_ssetup_hdr(ses, pSMB);
 805
 806	pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
 807	if (ses->user_name != NULL) {
 808		pSMB->req_no_secext.CaseInsensitivePasswordLength =
 809				cpu_to_le16(CIFS_AUTH_RESP_SIZE);
 810		pSMB->req_no_secext.CaseSensitivePasswordLength =
 811				cpu_to_le16(CIFS_AUTH_RESP_SIZE);
 812
 813		/* calculate ntlm response and session key */
 814		rc = setup_ntlm_response(ses, sess_data->nls_cp);
 815		if (rc) {
 816			cifs_dbg(VFS, "Error %d during NTLM authentication\n",
 817					 rc);
 818			goto out;
 819		}
 820
 821		/* copy ntlm response */
 822		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
 823				CIFS_AUTH_RESP_SIZE);
 824		bcc_ptr += CIFS_AUTH_RESP_SIZE;
 825		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
 826				CIFS_AUTH_RESP_SIZE);
 827		bcc_ptr += CIFS_AUTH_RESP_SIZE;
 828	} else {
 829		pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
 830		pSMB->req_no_secext.CaseSensitivePasswordLength = 0;
 831	}
 832
 833	if (ses->capabilities & CAP_UNICODE) {
 834		/* unicode strings must be word aligned */
 835		if (sess_data->iov[0].iov_len % 2) {
 836			*bcc_ptr = 0;
 837			bcc_ptr++;
 838		}
 839		unicode_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
 840	} else {
 841		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
 842	}
 
 843
 
 
 844
 845	sess_data->iov[2].iov_len = (long) bcc_ptr -
 846			(long) sess_data->iov[2].iov_base;
 847
 848	rc = sess_sendreceive(sess_data);
 849	if (rc)
 850		goto out;
 851
 852	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
 853	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
 854
 855	if (smb_buf->WordCount != 3) {
 856		rc = -EIO;
 857		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
 858		goto out;
 859	}
 860
 861	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
 862		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
 863
 864	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
 865	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
 866
 867	bytes_remaining = get_bcc(smb_buf);
 868	bcc_ptr = pByteArea(smb_buf);
 869
 870	/* BB check if Unicode and decode strings */
 871	if (bytes_remaining == 0) {
 872		/* no string area to decode, do nothing */
 873	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
 874		/* unicode string area must be word-aligned */
 875		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
 876			++bcc_ptr;
 877			--bytes_remaining;
 878		}
 879		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
 880				      sess_data->nls_cp);
 881	} else {
 882		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
 883				    sess_data->nls_cp);
 884	}
 885
 886	rc = sess_establish_session(sess_data);
 887out:
 888	sess_data->result = rc;
 889	sess_data->func = NULL;
 890	sess_free_buffer(sess_data);
 891	kfree(ses->auth_key.response);
 892	ses->auth_key.response = NULL;
 893}
 894
 895static void
 896sess_auth_ntlmv2(struct sess_data *sess_data)
 897{
 898	int rc = 0;
 899	struct smb_hdr *smb_buf;
 900	SESSION_SETUP_ANDX *pSMB;
 901	char *bcc_ptr;
 902	struct cifs_ses *ses = sess_data->ses;
 903	__u32 capabilities;
 904	__u16 bytes_remaining;
 905
 906	/* old style NTLM sessionsetup */
 907	/* wct = 13 */
 908	rc = sess_alloc_buffer(sess_data, 13);
 909	if (rc)
 910		goto out;
 911
 912	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
 913	bcc_ptr = sess_data->iov[2].iov_base;
 914	capabilities = cifs_ssetup_hdr(ses, pSMB);
 915
 916	pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
 917
 918	/* LM2 password would be here if we supported it */
 919	pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
 920
 921	if (ses->user_name != NULL) {
 922		/* calculate nlmv2 response and session key */
 923		rc = setup_ntlmv2_rsp(ses, sess_data->nls_cp);
 924		if (rc) {
 925			cifs_dbg(VFS, "Error %d during NTLMv2 authentication\n", rc);
 926			goto out;
 927		}
 928
 929		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
 930				ses->auth_key.len - CIFS_SESS_KEY_SIZE);
 931		bcc_ptr += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
 932
 933		/* set case sensitive password length after tilen may get
 934		 * assigned, tilen is 0 otherwise.
 935		 */
 936		pSMB->req_no_secext.CaseSensitivePasswordLength =
 937			cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
 938	} else {
 939		pSMB->req_no_secext.CaseSensitivePasswordLength = 0;
 940	}
 941
 942	if (ses->capabilities & CAP_UNICODE) {
 943		if (sess_data->iov[0].iov_len % 2) {
 944			*bcc_ptr = 0;
 945			bcc_ptr++;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 946		}
 947		unicode_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
 948	} else {
 949		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
 950	}
 951
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 952
 953	sess_data->iov[2].iov_len = (long) bcc_ptr -
 954			(long) sess_data->iov[2].iov_base;
 955
 956	rc = sess_sendreceive(sess_data);
 957	if (rc)
 958		goto out;
 959
 960	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
 961	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
 962
 963	if (smb_buf->WordCount != 3) {
 964		rc = -EIO;
 965		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
 966		goto out;
 967	}
 968
 969	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
 970		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
 971
 972	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
 973	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
 974
 975	bytes_remaining = get_bcc(smb_buf);
 976	bcc_ptr = pByteArea(smb_buf);
 977
 978	/* BB check if Unicode and decode strings */
 979	if (bytes_remaining == 0) {
 980		/* no string area to decode, do nothing */
 981	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
 982		/* unicode string area must be word-aligned */
 983		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
 984			++bcc_ptr;
 985			--bytes_remaining;
 986		}
 987		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
 988				      sess_data->nls_cp);
 989	} else {
 990		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
 991				    sess_data->nls_cp);
 992	}
 993
 994	rc = sess_establish_session(sess_data);
 995out:
 996	sess_data->result = rc;
 997	sess_data->func = NULL;
 998	sess_free_buffer(sess_data);
 999	kfree(ses->auth_key.response);
1000	ses->auth_key.response = NULL;
1001}
1002
1003#ifdef CONFIG_CIFS_UPCALL
1004static void
1005sess_auth_kerberos(struct sess_data *sess_data)
1006{
1007	int rc = 0;
1008	struct smb_hdr *smb_buf;
1009	SESSION_SETUP_ANDX *pSMB;
1010	char *bcc_ptr;
1011	struct cifs_ses *ses = sess_data->ses;
1012	__u32 capabilities;
1013	__u16 bytes_remaining;
1014	struct key *spnego_key = NULL;
1015	struct cifs_spnego_msg *msg;
1016	u16 blob_len;
1017
1018	/* extended security */
1019	/* wct = 12 */
1020	rc = sess_alloc_buffer(sess_data, 12);
1021	if (rc)
1022		goto out;
1023
1024	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1025	bcc_ptr = sess_data->iov[2].iov_base;
1026	capabilities = cifs_ssetup_hdr(ses, pSMB);
1027
1028	spnego_key = cifs_get_spnego_key(ses);
1029	if (IS_ERR(spnego_key)) {
1030		rc = PTR_ERR(spnego_key);
1031		spnego_key = NULL;
1032		goto out;
1033	}
1034
1035	msg = spnego_key->payload.data[0];
1036	/*
1037	 * check version field to make sure that cifs.upcall is
1038	 * sending us a response in an expected form
1039	 */
1040	if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) {
1041		cifs_dbg(VFS,
1042		  "incorrect version of cifs.upcall (expected %d but got %d)",
1043			      CIFS_SPNEGO_UPCALL_VERSION, msg->version);
1044		rc = -EKEYREJECTED;
1045		goto out_put_spnego_key;
1046	}
1047
1048	ses->auth_key.response = kmemdup(msg->data, msg->sesskey_len,
1049					 GFP_KERNEL);
1050	if (!ses->auth_key.response) {
1051		cifs_dbg(VFS, "Kerberos can't allocate (%u bytes) memory",
1052				msg->sesskey_len);
1053		rc = -ENOMEM;
1054		goto out_put_spnego_key;
1055	}
1056	ses->auth_key.len = msg->sesskey_len;
1057
1058	pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
1059	capabilities |= CAP_EXTENDED_SECURITY;
1060	pSMB->req.Capabilities = cpu_to_le32(capabilities);
1061	sess_data->iov[1].iov_base = msg->data + msg->sesskey_len;
1062	sess_data->iov[1].iov_len = msg->secblob_len;
1063	pSMB->req.SecurityBlobLength = cpu_to_le16(sess_data->iov[1].iov_len);
1064
1065	if (ses->capabilities & CAP_UNICODE) {
1066		/* unicode strings must be word aligned */
1067		if ((sess_data->iov[0].iov_len
1068			+ sess_data->iov[1].iov_len) % 2) {
1069			*bcc_ptr = 0;
1070			bcc_ptr++;
1071		}
1072		unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp);
1073		unicode_domain_string(&bcc_ptr, ses, sess_data->nls_cp);
1074	} else {
1075		/* BB: is this right? */
1076		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
 
1077	}
1078
1079	sess_data->iov[2].iov_len = (long) bcc_ptr -
1080			(long) sess_data->iov[2].iov_base;
1081
1082	rc = sess_sendreceive(sess_data);
1083	if (rc)
1084		goto out_put_spnego_key;
1085
1086	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1087	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1088
1089	if (smb_buf->WordCount != 4) {
1090		rc = -EIO;
1091		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1092		goto out_put_spnego_key;
1093	}
1094
1095	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1096		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1097
1098	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1099	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1100
1101	bytes_remaining = get_bcc(smb_buf);
1102	bcc_ptr = pByteArea(smb_buf);
1103
1104	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1105	if (blob_len > bytes_remaining) {
1106		cifs_dbg(VFS, "bad security blob length %d\n",
1107				blob_len);
1108		rc = -EINVAL;
1109		goto out_put_spnego_key;
1110	}
1111	bcc_ptr += blob_len;
1112	bytes_remaining -= blob_len;
1113
1114	/* BB check if Unicode and decode strings */
1115	if (bytes_remaining == 0) {
1116		/* no string area to decode, do nothing */
1117	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1118		/* unicode string area must be word-aligned */
1119		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
1120			++bcc_ptr;
1121			--bytes_remaining;
1122		}
1123		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1124				      sess_data->nls_cp);
1125	} else {
1126		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1127				    sess_data->nls_cp);
1128	}
1129
1130	rc = sess_establish_session(sess_data);
1131out_put_spnego_key:
1132	key_invalidate(spnego_key);
1133	key_put(spnego_key);
1134out:
1135	sess_data->result = rc;
1136	sess_data->func = NULL;
1137	sess_free_buffer(sess_data);
1138	kfree(ses->auth_key.response);
1139	ses->auth_key.response = NULL;
1140}
1141
1142#endif /* ! CONFIG_CIFS_UPCALL */
1143
1144/*
1145 * The required kvec buffers have to be allocated before calling this
1146 * function.
1147 */
1148static int
1149_sess_auth_rawntlmssp_assemble_req(struct sess_data *sess_data)
1150{
1151	struct smb_hdr *smb_buf;
1152	SESSION_SETUP_ANDX *pSMB;
1153	struct cifs_ses *ses = sess_data->ses;
1154	__u32 capabilities;
1155	char *bcc_ptr;
1156
1157	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1158	smb_buf = (struct smb_hdr *)pSMB;
1159
1160	capabilities = cifs_ssetup_hdr(ses, pSMB);
1161	if ((pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) == 0) {
1162		cifs_dbg(VFS, "NTLMSSP requires Unicode support\n");
1163		return -ENOSYS;
1164	}
1165
1166	pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
1167	capabilities |= CAP_EXTENDED_SECURITY;
1168	pSMB->req.Capabilities |= cpu_to_le32(capabilities);
1169
1170	bcc_ptr = sess_data->iov[2].iov_base;
1171	/* unicode strings must be word aligned */
1172	if ((sess_data->iov[0].iov_len + sess_data->iov[1].iov_len) % 2) {
1173		*bcc_ptr = 0;
1174		bcc_ptr++;
1175	}
1176	unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp);
1177
1178	sess_data->iov[2].iov_len = (long) bcc_ptr -
1179					(long) sess_data->iov[2].iov_base;
1180
1181	return 0;
1182}
1183
1184static void
1185sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data);
1186
1187static void
1188sess_auth_rawntlmssp_negotiate(struct sess_data *sess_data)
1189{
1190	int rc;
1191	struct smb_hdr *smb_buf;
1192	SESSION_SETUP_ANDX *pSMB;
1193	struct cifs_ses *ses = sess_data->ses;
1194	__u16 bytes_remaining;
1195	char *bcc_ptr;
1196	u16 blob_len;
1197
1198	cifs_dbg(FYI, "rawntlmssp session setup negotiate phase\n");
1199
1200	/*
1201	 * if memory allocation is successful, caller of this function
1202	 * frees it.
1203	 */
1204	ses->ntlmssp = kmalloc(sizeof(struct ntlmssp_auth), GFP_KERNEL);
1205	if (!ses->ntlmssp) {
1206		rc = -ENOMEM;
1207		goto out;
1208	}
1209	ses->ntlmssp->sesskey_per_smbsess = false;
1210
1211	/* wct = 12 */
1212	rc = sess_alloc_buffer(sess_data, 12);
1213	if (rc)
1214		goto out;
1215
1216	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1217
1218	/* Build security blob before we assemble the request */
1219	build_ntlmssp_negotiate_blob(pSMB->req.SecurityBlob, ses);
1220	sess_data->iov[1].iov_len = sizeof(NEGOTIATE_MESSAGE);
1221	sess_data->iov[1].iov_base = pSMB->req.SecurityBlob;
1222	pSMB->req.SecurityBlobLength = cpu_to_le16(sizeof(NEGOTIATE_MESSAGE));
1223
1224	rc = _sess_auth_rawntlmssp_assemble_req(sess_data);
1225	if (rc)
1226		goto out;
1227
1228	rc = sess_sendreceive(sess_data);
1229
1230	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1231	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1232
1233	/* If true, rc here is expected and not an error */
1234	if (sess_data->buf0_type != CIFS_NO_BUFFER &&
1235	    smb_buf->Status.CifsError ==
1236			cpu_to_le32(NT_STATUS_MORE_PROCESSING_REQUIRED))
1237		rc = 0;
1238
1239	if (rc)
1240		goto out;
1241
1242	cifs_dbg(FYI, "rawntlmssp session setup challenge phase\n");
1243
1244	if (smb_buf->WordCount != 4) {
1245		rc = -EIO;
1246		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1247		goto out;
1248	}
1249
 
 
1250	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1251	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1252
 
1253	bytes_remaining = get_bcc(smb_buf);
1254	bcc_ptr = pByteArea(smb_buf);
1255
1256	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1257	if (blob_len > bytes_remaining) {
1258		cifs_dbg(VFS, "bad security blob length %d\n",
1259				blob_len);
1260		rc = -EINVAL;
1261		goto out;
1262	}
1263
1264	rc = decode_ntlmssp_challenge(bcc_ptr, blob_len, ses);
1265out:
1266	sess_free_buffer(sess_data);
1267
1268	if (!rc) {
1269		sess_data->func = sess_auth_rawntlmssp_authenticate;
1270		return;
1271	}
1272
1273	/* Else error. Cleanup */
1274	kfree(ses->auth_key.response);
1275	ses->auth_key.response = NULL;
1276	kfree(ses->ntlmssp);
1277	ses->ntlmssp = NULL;
1278
1279	sess_data->func = NULL;
1280	sess_data->result = rc;
1281}
1282
1283static void
1284sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data)
1285{
1286	int rc;
1287	struct smb_hdr *smb_buf;
1288	SESSION_SETUP_ANDX *pSMB;
1289	struct cifs_ses *ses = sess_data->ses;
1290	__u16 bytes_remaining;
1291	char *bcc_ptr;
1292	unsigned char *ntlmsspblob = NULL;
1293	u16 blob_len;
1294
1295	cifs_dbg(FYI, "rawntlmssp session setup authenticate phase\n");
1296
1297	/* wct = 12 */
1298	rc = sess_alloc_buffer(sess_data, 12);
1299	if (rc)
1300		goto out;
1301
1302	/* Build security blob before we assemble the request */
1303	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1304	smb_buf = (struct smb_hdr *)pSMB;
1305	rc = build_ntlmssp_auth_blob(&ntlmsspblob,
1306					&blob_len, ses, sess_data->nls_cp);
1307	if (rc)
1308		goto out_free_ntlmsspblob;
1309	sess_data->iov[1].iov_len = blob_len;
1310	sess_data->iov[1].iov_base = ntlmsspblob;
1311	pSMB->req.SecurityBlobLength = cpu_to_le16(blob_len);
1312	/*
1313	 * Make sure that we tell the server that we are using
1314	 * the uid that it just gave us back on the response
1315	 * (challenge)
1316	 */
1317	smb_buf->Uid = ses->Suid;
1318
1319	rc = _sess_auth_rawntlmssp_assemble_req(sess_data);
1320	if (rc)
1321		goto out_free_ntlmsspblob;
1322
1323	rc = sess_sendreceive(sess_data);
1324	if (rc)
1325		goto out_free_ntlmsspblob;
1326
1327	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1328	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1329	if (smb_buf->WordCount != 4) {
1330		rc = -EIO;
1331		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1332		goto out_free_ntlmsspblob;
1333	}
1334
1335	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1336		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1337
1338	if (ses->Suid != smb_buf->Uid) {
1339		ses->Suid = smb_buf->Uid;
1340		cifs_dbg(FYI, "UID changed! new UID = %llu\n", ses->Suid);
1341	}
1342
1343	bytes_remaining = get_bcc(smb_buf);
1344	bcc_ptr = pByteArea(smb_buf);
1345	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1346	if (blob_len > bytes_remaining) {
1347		cifs_dbg(VFS, "bad security blob length %d\n",
1348				blob_len);
1349		rc = -EINVAL;
1350		goto out_free_ntlmsspblob;
1351	}
1352	bcc_ptr += blob_len;
1353	bytes_remaining -= blob_len;
1354
1355
1356	/* BB check if Unicode and decode strings */
1357	if (bytes_remaining == 0) {
1358		/* no string area to decode, do nothing */
1359	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1360		/* unicode string area must be word-aligned */
1361		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
1362			++bcc_ptr;
1363			--bytes_remaining;
1364		}
1365		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1366				      sess_data->nls_cp);
1367	} else {
1368		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1369				    sess_data->nls_cp);
1370	}
1371
1372out_free_ntlmsspblob:
 
 
 
 
 
1373	kfree(ntlmsspblob);
1374out:
1375	sess_free_buffer(sess_data);
1376
1377	 if (!rc)
1378		rc = sess_establish_session(sess_data);
1379
1380	/* Cleanup */
1381	kfree(ses->auth_key.response);
1382	ses->auth_key.response = NULL;
1383	kfree(ses->ntlmssp);
1384	ses->ntlmssp = NULL;
1385
1386	sess_data->func = NULL;
1387	sess_data->result = rc;
1388}
1389
1390static int select_sec(struct cifs_ses *ses, struct sess_data *sess_data)
1391{
1392	int type;
1393
1394	type = cifs_select_sectype(ses->server, ses->sectype);
1395	cifs_dbg(FYI, "sess setup type %d\n", type);
1396	if (type == Unspecified) {
1397		cifs_dbg(VFS,
1398			"Unable to select appropriate authentication method!");
1399		return -EINVAL;
1400	}
1401
1402	switch (type) {
1403	case LANMAN:
1404		/* LANMAN and plaintext are less secure and off by default.
1405		 * So we make this explicitly be turned on in kconfig (in the
1406		 * build) and turned on at runtime (changed from the default)
1407		 * in proc/fs/cifs or via mount parm.  Unfortunately this is
1408		 * needed for old Win (e.g. Win95), some obscure NAS and OS/2 */
1409#ifdef CONFIG_CIFS_WEAK_PW_HASH
1410		sess_data->func = sess_auth_lanman;
1411		break;
1412#else
1413		return -EOPNOTSUPP;
1414#endif
1415	case NTLM:
1416		sess_data->func = sess_auth_ntlm;
1417		break;
1418	case NTLMv2:
1419		sess_data->func = sess_auth_ntlmv2;
1420		break;
1421	case Kerberos:
1422#ifdef CONFIG_CIFS_UPCALL
1423		sess_data->func = sess_auth_kerberos;
1424		break;
1425#else
1426		cifs_dbg(VFS, "Kerberos negotiated but upcall support disabled!\n");
1427		return -ENOSYS;
1428		break;
1429#endif /* CONFIG_CIFS_UPCALL */
1430	case RawNTLMSSP:
1431		sess_data->func = sess_auth_rawntlmssp_negotiate;
1432		break;
1433	default:
1434		cifs_dbg(VFS, "secType %d not supported!\n", type);
1435		return -ENOSYS;
1436	}
1437
1438	return 0;
1439}
1440
1441int CIFS_SessSetup(const unsigned int xid, struct cifs_ses *ses,
1442		    const struct nls_table *nls_cp)
1443{
1444	int rc = 0;
1445	struct sess_data *sess_data;
1446
1447	if (ses == NULL) {
1448		WARN(1, "%s: ses == NULL!", __func__);
1449		return -EINVAL;
1450	}
1451
1452	sess_data = kzalloc(sizeof(struct sess_data), GFP_KERNEL);
1453	if (!sess_data)
1454		return -ENOMEM;
1455
1456	rc = select_sec(ses, sess_data);
1457	if (rc)
1458		goto out;
1459
1460	sess_data->xid = xid;
1461	sess_data->ses = ses;
1462	sess_data->buf0_type = CIFS_NO_BUFFER;
1463	sess_data->nls_cp = (struct nls_table *) nls_cp;
1464
1465	while (sess_data->func)
1466		sess_data->func(sess_data);
1467
1468	/* Store result before we free sess_data */
1469	rc = sess_data->result;
1470
1471out:
1472	kfree(sess_data);
1473	return rc;
1474}