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}
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}