Linux Audio

Check our new training course

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